mysql的一些優化
前言 : SQL優化,是一種概率層面的優化。至於是否實際使用了我們的優化,需要通過explain進行推測。
注意:服務層中有SQL優化器,可能會影響我們的優化,同時註明:sql的優化前提是有索引!有索引!有索引!
● in和exists的使用場景
select * from A where id exists (select * from B)
exist語法:
將主查詢(A)的結果,放到子查詢(B)結果中進行條件校驗(看子查詢是否有資料,如果有資料則校驗成功) ,
如果符合校驗,則保留資料;也就是說A的資料越少越好.so,exists適合主查詢為小表,子查詢為大表;
結論:
如果主查詢的資料集大,則使用in,效率高.
如果子查詢的資料集大,則使用exists,效率高。
● like儘量以’常量’開頭,不要以"%"開頭,否則索引失效
I: select * from A where name like '%h%' ; name索引失效(explain檢視)
II: 如果必須使用like '%xx%'進行模糊查詢,可以使用索引覆蓋,挽救一部分; select name from A where name like '%x%' ;
● 複合索引
1.不要跨列使用或者無序使用,遵循最佳左字首
如 index_a_b(a,b) ; select * from A where b = 1 and a = 10 ---索引無效,索引順序有誤
select * from A where b = 1 ---索引失效,跨列使用
2.儘量使用全索引匹配
select * from A where a = 1 and b = 5 ;
● 不要在索引上進行任何操作(計算,轉換,函式),否則索引失效
1.select * from A where a * 3 = 6 ; ---索引失效
2.注意:如果查詢的是字串.一定得加''或者"",否則會轉換造成索引失效(查詢數字使用字元串同理)
select * from A where a = '6' ---索引失效,使用了轉換
3.對於複合索引,如果左邊失效,那麼右側全部失效
4.複合索引不能使用不等於(!=,<>) 或 is null (is not null) ,否則自身以及右側全部失效.複合索引如果有>,則自身和右側索引全部失效
● 儘量使用索引覆蓋(using index)
inde_a_b_c(a,b,c) ; select a,b,c from A where a = x and b = x;
● 儘量不要使用型別轉換(顯示,隱式),否則索引失效
select * from A where name = 'ws' ;
select * from A where name = 123 ; 底層將123->"123",進行了型別轉換,索引失效
● 儘量不使用or,否則索引失效
select * from A where a = 1 or id = 1 ; 造成or左側的索引失效