mysql优化之mysql查询性能排序分析
mysql 查询性能排序,从左至右,性能由最差到最好
all index range ref eq_ref const/system null
1.all 全表扫描
例:select * from user
2.index 索引全扫描
例:select id from user
3.range 索引范围扫描(>、<、>=、<=、=、between等)
例:select * from user where id >= 5
4.ref 使用非唯一索引扫描,或唯一索引的前缀扫描
例:select * from user where id = 5
join中也常出现ref
5.eq_ref 使用唯一索引(多表连接用主键或unique key作关联条件)
例:select * from teacher a, student b where a.id = b.id
6.const/system 常量
例:select * from(select * from user where id = 1)
备注:临时表中最多有一个匹配行(主键不重复),mysql会当成常量
等于是select * from 常量
7.null 不用查就有结果
例:select 1 from user
-------------------------------------------------------------------------------------------
索引在存储引擎层实现,所以每种存储引擎的索引不一定相同,也不一定都互相支持
4种索引:
b-tree、hash、r-tree、full-text
b-tree最常见,基本都支持
hash索引适用于key-value查询,不适用范围查询(<、>、<=、>=),memory支持
r-tree空间索引,不常用
full-text全文索引,5.6开始支持
如果列名为索引,使用column_name is null 就会使用索引,此处区别oracle
-------------------------------------------------------------------------------------------
索引存在,但不能使用的情况
1. like '%值',(前任意后精确)
例:select * from user where name like '%war3'
2.数据类型隐式转换
例:select * from user where id = 1
id是字符型,这里写了数字
3.不满足最左原则匹配
例:alter table warcraftiii add index idx(id,team,race)
添加复合索引idx
select * from warcraftiii where id = 5 可用索引
select * from warcraftiii where id = 5 and team = 'we' 可用索引
select * from warcraftiii where team = 'mym' and race = 'hum' 索引不可用
查id、id,team、id,race、id,team,race、都走索引,但是,查team,race不走
4.mysql估计用索引比全表扫描慢
(mysql内部有个sql优化器)
5.用or时,一个是索引,一个不是
是索引的那列,不会走索引
下一篇: 去除口臭十个小方法 每天按摩腹部