MySQL调优(二)——索引最佳实践
1.全值匹配
EXPLAIN SELECT * FROM employees WHERE name= ‘LiLei’;
EXPLAIN SELECT * FROM employees WHERE name= ‘LiLei’ AND age = 22;
EXPLAIN SELECT * FROM employees WHERE name= ‘LiLei’ AND age = 22 ANDposition =‘manager’;
2.最左前綴法則
如果索引了多列,要遵守最左前綴法則。
指的是查詢從索引的最左前列開始并且不跳過索引中的列。
EXPLAIN SELECT * FROM employees WHERE age = 22 AND position =‘manager’;
EXPLAIN SELECT * FROM employees WHERE position = ‘manager’;
EXPLAIN SELECT * FROM employees WHERE name = ‘LiLei’;
3.不在索引列上做任何操作(計(jì)算、函數(shù)、(自動(dòng)or手動(dòng))類型轉(zhuǎn)換),會(huì)導(dǎo)致索引失效而轉(zhuǎn)向全表掃描
EXPLAIN SELECT * FROM employees WHERE name = ‘LiLei’;
EXPLAIN SELECT * FROM employees WHERE left(name,3) = ‘LiLei’;
給hire_time增加一個(gè)普通索引:
EXPLAIN select * from employees where date(hire_time) =‘2018-09-30’
EXPLAIN select * from employees where hire_time >=‘2018-09-30 00:00:00’ andhire_time <=‘2018-09-30 23:59:59’
還原最初索引狀態(tài)
4.存儲(chǔ)引擎不能使用索引中范圍條件右邊的列
EXPLAIN SELECT * FROM employees WHERE name= ‘LiLei’ AND age = 22 ANDposition =‘manager’;
EXPLAIN SELECT * FROM employees WHERE name= ‘LiLei’ AND age > 22 ANDposition =‘manager’
5.盡量使用覆蓋索引(只訪問索引的查詢(索引列包含查詢列)),減少select *語句
EXPLAIN SELECT name,age FROM employees WHERE name= ‘LiLei’ AND age = 23AND position =‘manager
EXPLAIN SELECT * FROM employees WHERE name= ‘LiLei’ AND age = 23 ANDposition =‘manager’
6.mysql在使用不等于(!=或者<>)的時(shí)候無法使用索引會(huì)導(dǎo)致全表掃描
EXPLAIN SELECT * FROM employees WHERE name != ‘LiLei’;
7.is null,is not null 也無法使用索引
EXPLAIN SELECT * FROM employees WHERE name is null
8.like以通配符開頭(’$abc…’)mysql索引失效會(huì)變成全表掃描操作
EXPLAIN SELECT * FROM employees WHERE name like ‘%Lei’
EXPLAIN SELECT * FROM employees WHERE name like ‘Lei%
問題:解決like’%字符串%'索引不被使用的方法?
a)使用覆蓋索引,查詢字段必須是建立覆蓋索引字段
EXPLAIN SELECT name,age,position FROM employees WHERE name like ‘%Lei%’;
b)如果不能使用覆蓋索引則可能需要借助搜索引擎
9.字符串不加單引號(hào)索引失效
EXPLAIN SELECT * FROM employees WHERE name = ‘1000’;
EXPLAIN SELECT * FROM employees WHERE name = 1000;
10.少用or或in,
用它查詢時(shí),mysql不一定使用索引,mysql內(nèi)部?jī)?yōu)化器會(huì)根據(jù)檢索比例、表大小等多個(gè)因素整體評(píng)估是否使用索引,詳見范圍查詢優(yōu)化EXPLAIN SELECT * FROM employees WHERE name = ‘LiLei’ or name = ‘HanMeimei’
11.范圍查詢優(yōu)化
給年齡添加單值索引
explain select * from employees where age >=1 and age <=2000;
沒走索引原因:mysql內(nèi)部?jī)?yōu)化器會(huì)根據(jù)檢索比例、表大小等多個(gè)因素整體評(píng)估是否使用索引。
比如這個(gè)例子,可能是由于單次數(shù)據(jù)量查詢過大導(dǎo)致優(yōu)化器最終選擇不走索引優(yōu)化方法:可以講大的范圍拆分成多個(gè)小范圍
explain select * from employees where age >=1 and age <=1000;
explain select * from employees where age >=1001 and age <=2000
還原最初索引狀態(tài)
1ALTER TABLE employees
2DROP INDEX idx_age;
索引使用總結(jié):
like KK%相當(dāng)于=常量,%KK和%KK% 相當(dāng)于范圍
總結(jié)
以上是生活随笔為你收集整理的MySQL调优(二)——索引最佳实践的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 生命的起源
- 下一篇: 第120章 SQL函数 ROUND