1. 程式人生 > 其它 >MySQL資料庫效能優化該如何入手

MySQL資料庫效能優化該如何入手


今天小楊給大家分享一篇關於資料庫查詢優化,資料庫的操作越來越成為整個應用的效能瓶頸了,這點對於Web應用尤其明顯。關於資料庫的效能,這並不只是DBA才需要擔心的事,而這更是我們程式設計師需要去關注的事情。無論是小白還是職場的老手,都是必須掌握的一個手段。如果你對此瞭解不多,這塊內容還是好好看看!
第一步:找到那些查詢速度慢的語句

開啟慢日誌查詢:這個主要是幫我們收集時間較長的SQL語句,需要在配置檔案my.cnf裡面設定查詢的時間(long_query_time),以及儲存的路徑(slow_query_log_file),並對其開啟(slow_query_log)。對上面引數配置完成後,執行語句,檢視是否開啟,下圖為開啟的結果:<br>

show variables like 'slow_query%';

  

第二步:對找到的sql進行分析
1、 使用mysql的explain分析語句的狀態:


如上圖,explain出來的資訊有十多列,通過key列的值,我們可以看到使用到的索引,如果沒觸發到索引的話,可以檢視上篇文章,儘可能的觸發索引。

2、 如果開啟了show profile,該功能預設是關閉的,使用前需開啟。

show variables like 'profiling'; 
SHOW PROFILES


可以通過上面的語句 Duration 列觀看耗時

show profile cpu,block io for query id;/*id為show profiles列表中的Query_ID*/ 

也可以通過上面的語句,檢視該語句更為具體的引數進行判斷

第三步:找到問題的後對其進行效能的優化
1. 開啟MySQL的查詢快取

這個可以有效的提高查詢效能,當相同的查詢被執行多次的時候,這些查詢的結果會被放到快取中,後續的查詢直接返回快取的結果。但是也有一些查詢姿勢會導致快取無效,首先,想要查詢快取需要查詢語句一樣,另外條件查詢中不能使用一些易變的函式,如NOW(),CURDATE()等

2. 為查詢的欄位建立索引

對經常查詢的欄位建立索引,當資料量大的時候,通過建立索引可以有效的幫我們提高查詢的效率,但是也不是建太多的索引,不僅佔磁碟,當我們插入和跟新的時候也需要去維護,影響效率

3. 儘量避免使用 `select *` 以及當查詢一條資料的時候 用 `limit 1`

從資料庫讀取太多資料的時候,會影響到速度以及網路傳輸的負載,所以儘量使用具體欄位代替,覆蓋索引。當我們知道只想要一條資料的時候,當使用 `limit 1`時,資料庫引擎會在找到符合資料後停止往下搜尋,從而提高效率

4. 欄位設計的時候最好使用 `NOT NULL`

首先NULL本身是需要佔據儲存空間的,另外一方面,當索引欄位可以為NULL的時候,索引的效率會下降,除非你有特定的需要使用到NULL,不然還是儘可能的使用到 NOT NULL

5. 選擇正確的存在引擎 MyISAM 和 InnoDB

MyISAM 適合於一些需要大量查詢的應用,但其對於有大量寫操作並不是很好。甚至你只是需要update一個欄位,整個表都會被鎖起來,而別的程序,就算是讀程序都無法操作直到讀操作完成。InnoDB 的趨勢會是一個非常複雜的儲存引擎,對於一些小的應用,它會比 MyISAM 還慢。他是它支援“行鎖” ,於是在寫操作比較多的時候,會更優秀。並且,他還支援更多的高階應用,比如:事務。

6. 對錶進行水平拆分或者垂直拆分

- 水平拆分:當一張表的資料量大的時候(如登入表,使用者表)隨著時間的累加,資料量不斷累加,這個時候我們可以將表拆分成多張表,對使用者的名字或者id進行取模,從而分散存入到不同的表中,減少單表的壓力
- 垂直拆分:當表的欄位過多的時候,表佔用空間很大,檢索表的時候需要執行大量的IO,嚴重降低了效能,這個時候可以考慮將一些欄位拆分到多張表中,可以考慮下三大正規化。這樣可以降低表的複雜度和欄位的數目,從而達到優化的目的。

7. 避免索引的失效

日常中,我們建立了索引了,但是姿勢不對也可能讓我們全表掃描,總結一些日常的坑

- like 以%開頭,索引無效;當like字首沒有%,字尾有%時,索引有效。
- where 等式的時候使用了進行函式、算術運算或其他表示式運算
- whre子句中使用!=或<>操作符、null值判斷、使用 or 來連線條件,索引失效少用
- 使用聯合索引沒有遵守最左原則的時候,索引也無效


共同進步,學習分享

歡迎大家關注我的公眾號【寫程式碼的小楊】,相關文章、學習資料都會在裡面更新,整理的資料也會放在裡面。

覺得寫的還不錯的就點個贊,加個關注唄!點關注,不迷路,持續更新!!!