mysql的一些優化

2021-09-02 13:29:29 字數 1839 閱讀 6153

前言 : 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 ...