mysql為什麼需要優化

2021-10-17 09:43:56 字數 2844 閱讀 8270

mysql為什麼需要優化

今天用一篇文章講講為什麼sql需要優化,天天講怎麼優化,那麼到底為啥需要優化呢?不知道各位同學有沒有深思過這個問題。今天我們一起來思考一下。

先貼上mysql的官方的一段話

當使用myisam儲存引擎時,mysql使用極快速的表鎖定,以便允許多次讀或一次寫。使用該儲存引擎的最大問題出現在同乙個表中進行混合穩定資料流更新與慢速選擇。如果這只是某些表的問題,你可以使用另乙個儲存引擎。參見第15章:儲存引擎和表型別。

​mysql可以使用事務表和非事務表。為了更容易地讓非事務表順利工作(如果出現問題不能回滾),mysql採用下述規則。請注意這些規則只適用於不執行在嚴格模式下或為insert或update使用ignore規定程式時。

所有列有預設值。請注意當執行在嚴格sql模式(包括traditional sql模式)時,必須為not null列指定預設值。

如果向列內插入不合適的或超出範圍的值,mysql將該列設定為「最好的可能的值」,而不是報告錯誤。對於數字值,為0、可能的最小值或最大值。對於字串,為空字串或列內可以儲存的字串。請注意當執行在嚴格模式或traditional sql模式時該行為不適用。

所有表示式的計算結果返回乙個表示錯誤狀況的訊號。例如,1/0返回null。(使用error_for_division_by_zero sql模式可以更改該行為)。

如果正使用非事務表,不應該使用mysql來檢查列的內容。一般情況,最安全的(通常是最快的)方法徑是讓應用程式確保只向資料庫傳遞合法值。

相關詳細資訊參見1.8.6節,「mysql處理約束的方式」和13.2.4節,「insert語法」或5.3.2節,「sql伺服器模式」。

扎眼一看,我擦嘞,這說的是一些什麼鬼,

第一句話,涉及到myisam,一種資料庫儲存引擎,相信各位對它有一定了解(只支援表鎖)

那麼他這句話什麼意思呢?mysql使用極其快速的表鎖定,以便多次讀或一次寫。也是就是共享讀,排他寫,讀我們可以一起同時讀取這張表的資料,但是寫,在某一時刻,只能有乙個執行緒建立寫操作,這有什麼問題嗎?

第二句話就說了,使用該儲存引擎的最大問題就是:在同乙個表中進行混合穩定資料流更新與慢速選擇。啥意思?

意思是:在同一張表中,如果我們想得到乙個多個讀寫操作同時進行的時候,如果您使用這種儲存引擎,那麼我們能夠保證這張表的資料都是穩定更新的,不會出現異常。因為併發情況下,資料寫,不採取措施,就會有資料異常情況。

但是呢?會帶來乙個很大的問題,這張表的讀寫效能將極大降低,怎麼講?比如公共廁所,都是乙個人上廁所,後面的人都不能進去,只能同時有乙個人上廁所。那麼效率不高,如果男廁(農村的有些)可以同時多個人同時上廁所。相較而言,哪種效率高?(哈哈,例子沒舉好,抱歉)

那mysql就早知道這個問題?不解決一下嗎?是的,mysql是一款熱插拔性的資料庫,支援外掛程式式方式。也就是還提供了其他特性的資料庫儲存引擎供我們選擇,只需要切換一下即可,那麼其他的資料庫儲存引擎就會有解決這種問題的。這種操作,也就是將選擇權利放給我們程式設計師,讓我們自己去根據自己的業務情況,專案背景去選擇適合的資料庫儲存引擎。

所有列有預設值,請注意執行在嚴格sql模式時,必須為not null的列指定預設值;

這是什麼意思呢?這就是一種表結構設計規範了。也就是說如果我們對某個列設定為不為null,那麼我們就必須對其指定預設值。

如果向列中插入了不合適的或超出範圍的值,mysql會將該類設定為「最好的可能的值」,而不是報告錯誤。通俗來說,我設定乙個列儲存字元 varchar 100,這個時候,我往其儲存 200個字元的字串,但是mysql只會幫我記錄前100個字元,而不是告訴我超出,丟擲異常。

所有表示式的計算結果返回乙個表示錯誤狀況的訊號。例如1/0返回null。這屬於邏輯錯誤,語法錯誤。

那這些和事務表和非事務表有什麼關係嗎?

當然,如果是正在使用非事務的表正在執行一批sql,那恰好存在上述問題,那麼就會出現後面所描述的情況,不會丟擲異常,會做出預設的容錯處理,為了保證sql的正常進行。

那但是我們通常來說,如果存在了列存不下的情況,我們更希望資料庫能夠返回錯誤給我們,而不是一聲不吭。那麼這也是非事務表的乙個特性(此處不能說是弊端,只有合適和不合適)

那麼很簡單的兩個例子,mysql為什麼要舉這些例子呢?

當然,我們大部分同學所理解的優化,只是針對使用上優化,但是上述兩個例子,可能偏向於技術配置上的優化,但都屬於我們需要考慮的點。

mysql這句話有乙個標題「mysql設計侷限與折中」;我認為很有道理的。技術沒有好壞之分,只有適合不適合之分。作為乙個廣受歡迎的開源、關係型資料庫,占有大量的市場,那麼就需要提供各種情況的特性,只有我們對其不同的特性進行外掛程式式方式組合使用,搭配出最適合我們業務場景的資料庫,這才是最優的。而不是我們侷限於自己的眼光,覺得某個產品不行,這樣就是bug。

回答上面的問題,為什麼舉這些例子,我覺得mysql就是想表達自己產品的特性,可以自由定製,但需要我們使用者了解其特性,才能對其進行更優的使用。

那麼到底mysql為什麼需要優化呢?其實mysql給我們提供乙個穩定、高可用的資料庫使用,但是如果我們不看說明書就去使用它,或許,我們可以一路踩著坑,慢慢的會發現其使用的方式,但是如果我們不去關注它,只考慮能用,可以用就行了。那麼mysql這麼一款優秀的產品,很多高階特性我們都忽略了。就好比我們一輛勞斯萊斯拉貨,是的,12缸,動力賊強,什麼貨不能拉?拉一頭牛綽綽有餘,但是如果用好他,我們可以拉10頭牛,試問不是眾望所歸嗎?

優化本質上來說,是乙個很廣的概念,對於資料庫層面的優化,我們很多種點都可以考慮。

資料庫快取大小配置合理,那也是一種優化;表結構設計合理,也是優化;sql寫好了,也是優化;資料庫連線方式用好了,也是優化;

所以我認為優化是一種細節都應該考慮的問題,比如我們sql的優雅可讀,我也認為是優化。

資料庫關係著整個應用的資料資訊,是乙個應用最核心的組成。我認為資料庫用好了,應用的使用也有質的飛躍。

後面我會針對每個細節,都舉一些例項來說說,優化具體;

為什麼我們專案需要資料優化服務

早先幾年,硬體業存在摩爾定律,微處理器的效能每隔18個月提高一倍,而 下降一倍。在這種背景下,資料庫主機效能節節高公升,資料庫效能要提高,靠硬體的更新換代即可。此種情況下,許多程式設計師在開發時,有意無意地,忽略了資料庫應用的效能,而更關注需求實現的方便與簡單。目前,硬體業的摩爾定律已經失效。資料庫...

為什麼需要PKI

為什麼需要pki 隨著電子商務的迅速發展,資訊保安已成為焦點問題之一,尤其是網上支付和網路銀行對資訊保安的要求顯得更為突出。為了能在網際網路上開展安全的電子商務活動,公開金鑰基礎設施 pki,public key infrastructure 逐步在國內外得到廣泛應用。我們是否真的需要pki,pki...

為什麼需要prototype

1.new object var newobj new object newobj.name keti newobj.color red newobj.changecolor function color 這種方法看上去很蠢,所以我們找到另一種方法 使用literal直接建立,看上去要優雅得多 2....