一打開科技類論壇,最常看到的文章主題就是MySQL性能優化了,為什麼要優化呢?

因為

  • 資料庫出現瓶頸,系統的吞吐量出現訪問速度慢
  • 隨著應用程序的運行,資料庫的中的數據會越來越多,處理時間變長
  • 數據讀寫速度緩慢

就是咱們說的「性能問題」,程序員一遇到它總是焦頭爛額!

今天小編對MySQL優化總結了一些心得,希望在大家之後的工作中能有所有幫助!

like 前導符優化

like模糊查詢形如%AAA%和%AAA將不會使用索引,但是業務上不可避免可能又需要使用到這種形式。

通常的方法有兩種:

優化方案一:

使用覆蓋索引即查詢出的列只是用索引就可以獲取而無須查詢表記錄這樣也走了索引

優化方案二:

使用locate函數或者position函數代替like查詢
如table.field like %AAA%可以改為locate(AAA, table.field) > 0或POSITION(AAA IN table.field)>0

in 和 exist

如果查詢的兩個表大小相當,那麼用in和exists差別不大。 如果兩個表中一個較小,一個是大表,則子查詢表大的用exists,子查詢表小的用in: 例如:表A(小表),表B(大表)

示例一:

示例二:

not in 和 not exist

如果查詢語句使用了not in 那麼內外表都進行全表掃描,沒有用到索引;而not exist 的子查詢依然能用到表上的索引。所以無論哪個表大,用not exists都比not in要

子查詢優化

1、MySQL 5.6 之前的版本對子查詢處理:不會將查詢的結果集計算出來用作與其他表做join,outer表每掃描一條數據,子查詢都會被重新執行一遍。

2、MySQL 5.6 對子查詢的處理 :將子查詢的結果集 cache 到臨時表裡,臨時表索引主要用來移除重複記錄,並且隨後也可能用於做join查詢,這種技術在 5.6 中叫做物化的子查詢,物化子查詢可以看到select_type欄位為subquery,而在 5.5 裏為DEPENDENT SUBQUERY

3、子查詢一般都可以改成表的關聯查詢,子查詢會有臨時表的創建、銷毀,效率低下。

straight_join

mysql hint:

Mysql 優化器在處理多表的關聯的時候,很有可能會選擇錯誤的驅動表進行關聯,導致了關聯次數的增加,從而使得sql語句執行變得非常的緩慢。

這個時候需要有經驗的DBA進行判斷,選擇正確的驅動表,這個時候 straightjoin 就起了作用了,下面我們來看一看使用straight_join進行優化的案例:

嘗試採用user表做驅動表,使用straight_join強制連接順序:

高效分頁

傳統分頁

select * from table limit 10000,10

limit原理

1 Limit 10000,10
2偏移量越大則越慢

推薦分頁

複雜關聯SQL的優化

1、首先查詢返回的結果集,通常查詢返回的結果集很少,是有優化的空間的。

2、通過查看執行計劃,查看優化器選擇的驅動表,從執行計劃的rows可以大致反應出問題的所在。

3、搞清各表的關聯關係,查看關聯欄位是否有合適的索引

4、使用straight_join關鍵詞來強制調整驅動表的選擇,對優化的想法進行驗證。

5、如果條件允許,對複雜的SQL進行拆分。儘可能越簡單越好。

force index

有時優化器可能由於統計信息不準確等原因,沒有選擇最優的執行計劃,可以人為改變mysql的執行計劃,例如:

count的優化

按照效率排序的話,count(欄位)<count(主鍵id)<count(1)≈count(*),所以我建議你,盡量使用count(*)

總結

MySQL 性能優化 最主要是理解 innodb 的索引原理及結構及 SQL 的執行計劃,在不斷累積經驗的基礎上熟能生巧。

作者:老王談運維

出自:今日頭條原文:DBA大牛MySQL優化心得,語句執行加速就是這麼簡單!


超級經典的34道Mysql面試題

這34道面試題非常之經典,非常之贊,很多學過的朋友都會推薦給小夥伴一起學習

有需要的小夥伴可以留言「MySQL面試題」看到後會逐一發送的

杜老師B站最新MySQL視頻教程:

有需要的小夥伴可以留言「MySQL教程」看到後會逐一發送的


推薦閱讀:

動力節點:詳解JavaScript的任務、微任務、隊列以及代碼執行順序(文末附JavaScript視頻教程)?

zhuanlan.zhihu.com圖標
推薦閱讀:

相關文章