1. 程式人生 > 其它 >mysql語句大全_【乾貨】MySQL基礎優化教程

mysql語句大全_【乾貨】MySQL基礎優化教程

技術標籤:mysql語句大全

關注我,你的眼睛會懷孕

6d2ad892724d21fc24457c572b296db6.png

連線查詢的優化

無論什麼資料庫,多表連線的查詢成本都是比較高的,因此對於高併發應用,應該儘量減少有連線的查詢,多表連線的個數不要超過4張表。一般資料量少的時候,連線開小不大,一般不會有效能問題,當資料量變大後,那麼效能問題就會比較突出。所以在資料庫初期最好能確定哪個表能成為大表,然後進行反正規化設計減少連線的表,例如增加冗餘欄位等等,或者在業務程式碼中進行連線計算。

一些經驗總結點:

1、ON、USING字句中的列確認有索引,如果連線的順序為B、A,那麼只需在A表的列上建立索引即可,無需在B中建索引,可以減少不必要索引開銷。

查詢舉例:

SELECTB.*,A.*FROMBJOINAONB.col1=A.col2

MYSQL會全表掃描B表,對B表的每一行記錄去尋找A表記錄,所以需用A表COL2列上索引來提高效率。

2、使用EXPLAIN 檢查連線,看ROWS列,如果該列值太高,比如幾千,上萬的,那麼就需要考慮是否索引無效後者連線表的順序不對了。

3、考慮在應用層實現連線查詢,例如可以在JAVA中把複雜的查詢分解為幾個簡單查詢,得到一個較小的結果集合,處理遍歷後,再根據條件獲取完整資料,這樣做往往更高效,因為把資料分離,更不容易變化,有利於資料庫快取資料。

舉例如下:

SELECTa.*FROMAWHEREa.idIN(1,2,3,4,5,6,7,8,9,10);

如果id=1~8的記錄已經被儲存在快取REDIS中了,那麼我們只需要查詢id=9和10的資料,這樣減少了很多資料庫連線互動,可以提高效能。

GROUP BY、DISTINCT、ORDER BY 語句優化

這些語句預設都要進行ORDER BY排序,優化的思路比較類似。

1、如果多張表進行連線查詢,ORDER BY 的列應屬於連線順序的第一張表。如果不在同一個表中,那麼可以考慮冗餘一些列,或者合併表。

2、需要保證索引列和ORDER BY的列相同,且各列按照相同的方向進行排序。

3、指定ORDER BY NULL,預設情況下,MYSQL將排序所有GROUP BY的查詢,如果想要避免排序結果所產生的消耗,可以指定ORDER BY NULL。

舉例如下:

selectcount(1)fromsys_deptgroupbydept_idorderbynulllimit3

子查詢優化

由於子查詢可讀性比較符合開發人員的思路習慣,所以都習慣編寫子查詢,但子查詢在生產環境中,是最常見的效能瓶頸。

對於資料庫來說,大部分情況下,連線比子查詢更快,優化器一般可以生成更佳的執行計劃,可以餘弦裝載資料,更高效的處理查詢,子查詢生成的臨時表也沒有索引,因此效率會更低。

目前的實踐來說,子查詢應該儘量改寫成JOIN的寫法

舉個常見的例子

SELECTc1FROMt1wheret1.c1IN(SELECTc1FROMt2);

我們可以轉化為連線的方式:

SELECTc1FROMt1.c1FROMt1,t2WHEREt1.c1=t2.c2

優化IN列表

對於IN列表,MySQL會排序裡面的值,並使用二分查詢方式去定位資料,把IN字句改寫成OR形式其實沒什麼用。IN列表不建議太長,對於高併發業務,建議不超過幾十個。優化思路可以轉化為多個等於的查詢。例如下面的語句,如果ID值很多,其實效能不會太好。

SELECT*FROMAwhereA.IDIN(SELECTidFROMB)

優化思路:

可以從程式業務層出發,先查詢SELECT id FROM B,然後獲取到ID的值,逐步和 SELECT * FROM A進行拼接,轉化為 SELECT * FROM A where ID =?的形式。

優化UNION

UNION語句預設是去除重複記錄,需要用到排序操作,如果結果集很大,成本會很高,建議儘量使用UNION ALL 語句,對於UNION多個分表場景,應儘可能在資料庫分表的時候,就確定各個分表資料唯一性,這樣就無需使用UNION來去重了。

另外查詢語句外的WHERE條件並不會應用到每個單獨的UNION子句中,所以每個UNION子句都新增where條件。

優化BLOB、TEXT型別欄位的查詢

由於mysql記憶體臨時表暫不支援BLOB、TEXT型別,如果包含他們的查詢就要用到基於磁碟的臨時表,效能會很低,所以如無必要,查詢條件就不要這2種類型。

優化思路:

1、如果必須使用,可以考慮拆分表,把BLOB、TEXT欄位分離到單獨的表中。

2、如果有許多大欄位,可以考慮合併這些欄位到一個欄位,儲存一個大200KB比儲存20個10KB更有效。

3、考慮使用COMPRESS(),再儲存。

作者:程式不就是0和1

來源:https://database.51cto.com/art/201912/607890.htm

年度熱文

632631bd13ebed22f1840de07fddcfe9.png

【必看】一次心驚肉跳的伺服器入侵排查....

【必看】IT行業常用專業術語,你get到了嗎?

【必看】網路工程師技能圖譜,這些你都會嗎?

【乾貨】伺服器效能優化的8種常用方法

【乾貨】網工常見面試題集錦(一)

【收藏】網工常見面試題集錦(二)

【必看】這些Linux命令能解決95%以上的問題

【必看】超全Linux工作規劃線路圖

【必看】網工面試必答問題,看完OFFER輕鬆拿

【乾貨】華為交換機埠vlan詳解

【乾貨】什麼樣的網路需要劃分VLAN?

【乾貨】組播原理協議講解

【收藏】網路故障處理手冊大全,看完再也不怕出問題了



c4aa5c01dd8ce672ca8f7dae34bf66ff.png

系統整合/認證培訓

買裝置,找我們

IT維保,找我們

IT培訓,找我們