mysql資料庫查詢優化,該從哪幾個方面進行優化?

2021-09-26 23:18:08 字數 1664 閱讀 6734

當mysql資料庫中資料越來越多的時候,或許我們會發現查詢的效率越來越低了,可能低到令人髮指的地步,僅僅查詢幾條資料就要要十幾秒甚至幾十秒鐘,這是十分致命的,如果使用者訪問你的**,十幾秒過去了資料都載入不出來,那麼造成的使用者流失是不可想象的。

於是乎,我們就要分析是什麼造成了資料庫查詢效率低下。

一般來講,造成這種結果有下面這幾個原因:

1,sql語句與索引

2,表結構

3,儲存引擎

4,網絡卡流量

5,伺服器硬體

6,磁碟io

本文中我們主要針對sql與索引進行優化,因為這是成本最低,效果最好的優化方案(當然,如果錢多,公升級公升級硬體比什麼優化都好使)

1,使用表連線代替子查詢,首先表連線不會再記憶體中建立臨時表,其次,例如在where中使用子查詢,會增加資料查詢的次數。

2,在編寫sql語句的時候,一定要注意函式、運算子或關鍵字的用法,因為可能會導致索引失效,導致全表掃瞄,使查詢效率大打折扣。具體可以參考該鏈結中的文章,有比較詳細的解讀,我這裡就不重複了

3,在搜尋字元型字段時,我們有時會使用like關鍵字和萬用字元,這種做法雖然簡單,但卻也是以犧牲系統效能為代價的,能不用盡量不用,如果要用,就在有索引的字段上用。

4,避免在查詢中讓mysql進行自動型別轉換,因為轉換過程也會使索引變得不起作用,最好是在相同型別的字段間進行比較的操作。

5,使用union來代替手動建立臨時表,它可以把需要使用臨時表的兩條或更多的select查詢合併的乙個查詢中。在客戶端的查詢會話結束的時候,臨時表會被自動刪除,從而保證資料庫整齊、高效

6,進行鎖定表的操作,事務肯定是mysql中不可缺少的,這是資料安全的基本保障,但是事務機制是對資料庫的鎖定,這會造成高併發情況下,使用者的訪問響應延遲,帶來不好的使用者體驗,所以我們可以手動將鎖定範圍縮小,進行表鎖定

lock table inventory write select quantity  from   inventory   where item='book';

...update inventory set quantity=11 where item='book';unlocktables

7,索引優化,索引應該是mysql提高查詢速度最常用的一種辦法了,我們應該在哪些字段建立索引呢?

因為場景不同要求也不同,這時候可以檢視慢查詢日誌,選取合適字段建立索引,一般情況下,索引使用原則:

經常被查詢的高頻字段需要建立索引;

不要在大字段中建立索引,例如text型別的字段;

使用索引之後,查詢數量量佔總表資料量的3%-5%是最能發揮索引效果的乙個範圍;

在聯合索引中,一定要遵循左字首元組,否則索引失效。

想知道自己寫的sql語句是否用到了索引,可以用explain關鍵字檢視一下

8,切分sql語句,將邏輯複雜,又長關聯又多的sql語句拆分成多個單個查詢的小的sql語句,這樣子既可以讓快取的效率更高,又可以減少鎖表鎖行的時間

最後借用一句話總結一下sql語句的優化:

首先定位應用程式內哪些sql語句會比較慢,我們可以通過慢查詢日誌,show profiles ,show processlist, 然後通過explain來查詢這條或這些條sql語句為什麼會慢,然後進行一系列的優化。

優化,首先從索引著手,然後從資料訪問,長難查詢語句,以及特定型別的查詢語句來進行優化。

mysql 資料庫查詢優化

合理選擇表字段型別型別 int型別優先於varchar型別 優先於text型別 varchar 變長字串 型別優先於char 不可變長 型別 表分割 對於頻繁使用的且資料量增長很快的表進行表的分割 水平分割 當一張表資料量非常大影響效率時,可將表中的資料按一定的演算法將其進行水平方向 行 的分割,如...

mysql 資料庫查詢優化

從上圖可以看出,計算機系統硬體效能從高到代依次為 cpu cache l1 l2 l3 記憶體 ssd硬碟 網路 硬碟 根據資料庫知識,我們可以列出每種硬體主要的工作內容 cpu及記憶體 快取資料訪問 比較 排序 事務檢測 sql解析 函式或邏輯運算 網路 結果資料傳輸 sql請求 遠端資料庫訪問 ...

mysql資料庫查詢優化

上兩周一直想辦法提高查詢速度,取得一點效果,解決了部分問題,記下來以便將來自己檢視。由於公司沒有專門的dba,我自己對mysql資料庫也不是很熟悉,而且這個j a開發的網路審計系統的管理系統,是經過了n多人幾年時間的修修改改,今天到我們手裡,要改成能支援大流量情況的版本,所以對我們這個只有幾個人的j...