基础概念
索引
索引分为普通索引、唯一索引、主键索引、组合索引、全文索引
何时使用索引
MySQL 每次查询只使用一个索引(因为分析两个索引 B+ 树比全表扫描更慢)
主键、Unique 字段
和其他表做连接的字段需要加索引
在 where 中使用>、 ≥、 =、 <、 ≤、 is null 、between 等字段
使用不以通配符开始的 like 字段
聚焦函数 MIN、MAX 中的字段
order by 和 group by 字段
索引何时失效
七字口诀:模型数空运最快 来自 「B 站 老猿说开发」
模:模糊查询 LIKE 以%开头
型:数据类型错误
数:对索引字段使用内部函数
空:索引列是 NULL
运:索引列进行四则运算
最:联合索引不按索引列最左开始查找
快:全表查找预计比索引更快
一些其他的情况
查询一个索引而在另一个索引上做order by
例如 where A = a order by B,只使用A上面的索引or 会使索引失效,但是如果查询字段相同则不失效
例如where A = a1 or A = a2(生效),where A = a or B = b(失效)如果列类型是字符串,要使用引号
例如 where A = 'a' 不然会进行类型转化使得索引失效在索引列上的操作,函数(upper()等)、or、!=(<>)、not in等
Explain命令字段解释
数据库查看索引生效网站 SQL Fiddle
type 字段
type字段为All,未使用索引;为ref,使用索引
ALL: 全表扫描
index: 索引全扫描
range: 索引范围扫描,常用语<,<=,>=,between等操作
ref: 使用非唯一索引扫描或唯一索引前缀扫描,返回单条记录,常出现在关联查询中
eq_ref: 类似ref,区别在于使用的是唯一索引,使用主键的关联查询
const/system: 单条记录,系统会把匹配行中的其他列作为常数处理,如主键或唯一索引查询
null: MySQL不访问任何表或索引,直接返回结果