有時候發現資料量大的時候查詢起來效率就比較慢了,學習一下mysql語句優化的原則,自己在正常寫sql的時候還沒注意到這些,先記錄下來,慢慢一點一點的學,加油!
這幾篇部落格寫的都可以:
使用索引的原則:
1.最左字首匹配原則。
mysql會一直向右匹配直到遇到範圍查詢(>、
不會用到b的索引:
where a=1 and c>0 and b=2
會用到b的索引:
where a=1 and b=2 and c>0
2.盡量選擇區分度高的列作為索引,區分度的公式是count(distinct col)/count(*),表示欄位不重複的比例,比例越大我們掃瞄的記錄數越少。
3.當取出的資料超過全表資料的20%時,不會使用索引。
4.使用like時注意:
不使用索引:
like 『%l%』
使用索引:
like 『l%』
5.盡量將or 轉換為 union all
不使用索引:
select * from user where name=』a』 or age=』20』
使用索引:
select * from user where name=』a』union all select * from user where age=』20』
6.欄位加函式不會使用索引。所以盡量把函式放在數值上
不使用索引:
where truncate(price) = 1
使用索引:
where price > 1 and price < 2
7.如果使用數字作為字元,則數字需要加引號,否則mysql會自動在列上加資料型別轉換函式
不使用索引
where mobile=18534874321
使用索引
where mobile=』18534874321』
8.欄位加運算子不會使用索引。所以盡量把運算放在數值上
不使用索引:
select account_name, amount from transaction where amount + 3000 >5000;
使用索引:
select account_name, amount from transaction where amount > 2000 ;
9.使用組合索引時,必須要包括第乙個列。
例如alter table test add index(a,b,c):
不使用索引:
where b=1, c=2
where b=1
where c=2
使用索引:
where a=1, b=1, c=2
where a=1, b=1
where a=1, c=2
10.盡量避免使用is null或is not null
不使用索引:
select … from department where dept_code is not null;
使用索引:
select … from department where dept_code >0;
11.不等於(!=)不會使用索引
不使用索引:
select account_name from transaction where amount !=0;
使用索引:
select account_name from transaction where amount >0;
12.order by 子句只在以下的條件下使用索引:
order by中所有的列必須包含在相同的索引中並保持在索引中的排列順序.
order by中不能既有asc也有desc
例如:alter table t1 add index(a,b);
alter table t1 add index(c);
不使用索引:
select * from t1 order by a,c; 不在乙個索引中
select * from t1 order by b; 沒有出現組合索引的第一列
select * from t1 order by a asc, b desc; 混合asc和desc
select * from t1 where a=1 order by c; where和order by用的不是同乙個索引,where使用索引,order by不使用。
使用索引:
select * from t1 order by a,b;
select * from t1 order where a=1 order by b;
select * from t1 order where a=1 order by a,b;
select * from t1 order by a desc, b desc;
select * from t1 where c=1 order by c;
13.索引不是越多越好。mysql需要資源來維護索引,任何資料的變更(增刪改)都會連帶修改索引的值。所以,需要平衡考慮索引帶來的查詢加速和增刪改減速。
其他注意事項
1.盡量避免使用select *
2.盡量使用表連線(join)代替子查詢select * from t1 where a in (select b from t2)
3.效能方面,表連線 > (not) exists > (not) in
mysql語句優化原則 MySQL語句優化的原則
1 使用索引來更快地遍歷表。預設情況下建立的索引是非群集索引,但有時它並不是最佳的。在非群集索引下,資料在物理上隨機存放在資料頁上。合理的索引設計要建立在對各種查詢的分析和 上。一般來說 a.有大量重複值 且經常有範圍查詢 和order by group by發生的列,可考慮建立群集索引 b.經常同...
mysql語句優化原則 MySQL語句優化的原則
mysql語句優化的原則 mysql語句優化的原則 1 使用索引來更快地遍歷表。預設情況下建立的索引是非群集索引,但有時它並不是最佳的。在非群集索引下,資料在物理上隨機存放在資料頁上。合理的索引設計要建立在對各種查詢的分析和 上。一般來說 a.有大量重複值 且經常有範圍查詢 和order by gr...
mysql語句優化原則
1 使用索引來更快地遍歷表。預設情況下建立的索引是非群集索引,但有時它並不是最佳的。在非群集索引下,資料在物理上隨機存放在資料頁上。合理的索引設計要建立在對各種查詢的分析和 上。一般來說 a.有大量重複值 且經常有範圍查詢 和order by group by發生的列,可考慮建立群集索引 b.經常同...