一、優(yōu)化步驟
(1)通過SQL監(jiān)控、請求、日志等找出耗時的SQL語句;
(2)使用Explain方式查看SQL耗時的具體原因;
(3)根據(jù)實際情況解決:索引、緩存、左右連接
二、Explain
- select_type:簡單查詢or復(fù)雜查詢?simple、primary、subquery、deriveer、union。
- type:SQL關(guān)聯(lián)類型,system > const > eq_ref > ref > range > index > All。一般達(dá)到range就行,最好達(dá)到ref級別。
- keys和key_len:具體使用到哪些索引及索引長度。
- extra:記錄額外信息,如使用覆蓋索引(Using index)、使用臨時表、使用外部排序(Using filesort)、使用某些聚合函數(shù)等等.
Type級別
system/const:如id=1這種常量 ;
eq_ref:主鍵或聯(lián)合主鍵被使用且返回一條;
ref:使用普通索引或唯一索引的部分前綴,可能找到多個值(如:name='zhangsan');
range:使用一個索引檢索某個范圍,如in、between、大于等等操作;
index:掃描全索引拿到結(jié)果,一般是掃描某個二級索引(唯一索引、普通索引、前綴索引等索引屬于二級索引)。
ALL:全表掃描。
三、索引
? ? ? ? 索引本質(zhì)上是方便MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。
(一)索引的分類
- 數(shù)據(jù)結(jié)構(gòu)維度: B+樹、Hash索引、全文索引、R-Tree索引。
- 物理存儲維度: 聚集索引、非聚集索引。
- 邏輯存儲維度: 主鍵索引、普通索引、聯(lián)合索引、唯一索引、空間索引。
唯一索引:索引值唯一,允許有null值。
主鍵索引:特殊的唯一索引,一個表只能有一個主鍵索引,且不能有null值。
聯(lián)合索引:在多個字段上創(chuàng)建索引,遵循最左前綴原則。
聚簇索引:正文內(nèi)容就是按照一定規(guī)則排序的目錄,如B+樹,按照索引排序,一個表只能有一個,存儲記錄物理連續(xù)。文章來源:http://www.zghlxwxcb.cn/news/detail-730347.html
非聚簇索引:目錄是目錄,正文純粹是正文,不按照索引排序,一個表可以有多個,存儲記錄物理不連續(xù)。文章來源地址http://www.zghlxwxcb.cn/news/detail-730347.html
(二)索引使用的注意事項
- 索引不能包含null,否則無效;
- 索引上不能使用not in和<>操作;
- 不要在索引列上進(jìn)行運算,會導(dǎo)致索引失效全表掃描;
- 查詢使用多個列時可以建組合索引,查詢時要符合最左前綴原則;
- 列長度過長時使用短索引,比如varchar2(100)的列可以使用列的前10個字段作索引;
- 控制索引的數(shù)量,過多的索引會消耗性能。
四、細(xì)節(jié)
- in/exists:in(適合子表比主表小的情況)、exists(適合子表比主表大的情況),盡可能讓小表驅(qū)動大表。
- not in/not exists:not in(內(nèi)外表全表掃描),not exists(無論跟大表小表都會用到表索引)。
- =和!=:盡量不使用!=避免全表掃描。
- like:左模糊匹配使用索引,全模糊匹配不使用索引。
- select:避免使用select *。
- union all/union:union需去重效率低,union all不去重效率高。
- 用連接代替子查詢,避免子查詢產(chǎn)生的臨時表。
- join:join的表不宜太多。left join是左表驅(qū)動右表,inner join會自動小表驅(qū)動大表。
到了這里,關(guān)于【MySQL】sql如何優(yōu)化?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!