前言 : sql優化,是一種概率層面的優化。至於是否實際使用了我們的優化,需要通過explain進行推測。
注意:服務層中有sql優化器,可能會影響我們的優化,同時註明:sql的優化前提是有索引!有索引!有索引!
● in和exists的使用場景
select * from a where exists (select * from b where a.id = b.id)
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左側的索引失效
一些 Mysql 的優化經驗
一些 mysql 的 優化經驗 從資料庫結構做起 字段型別的定義時遵循以下規則 選用字段長度最小 優先使用定長型 盡可能的定義 not null 數值型字段中避免使用 zerofill 如果要儲存的資料為字串,且可能值已知且有限,優先使用 enum 或 set 索引的優化至關重要 以下如果沒有特殊說...
Mysql的一些簡單優化
1.5.6以上預設innodb,其他預設搜尋引擎為myisam 2.在對於金融問題資料誤差,採用decimal,獲取採用bigint型別存 金額 1000 or 10000 or 100000,避免使用浮點去進行計算 3.設計索引的原則 1 最適合索引的列是出現在where子句中的列,或連線子句中指...
mysql常用的一些優化
深入淺出mysql資料庫開發,優化,管理維護 定期分析表analyze 如果已經刪除了表的一大部分,或者如果您已經對含有可變長度行的表 含有 varchar,blob 或 text 列的表 進行了很多更改,則應使用 optimize table。被刪除的記錄被保持在鏈結清單中,後續的 insert ...