简单优化:
1、不要使用 select *,尽量避免回表查询
2、尽量避免 in语句
3、如果 like 语句前后模糊匹配导致索引失效,可以使用 SELECT * FROM table WHERE INSTR(name, 'keyword') > 0;
4、其余字段加索引
5、limit时,尽量添加order by [索引字段],可以在大数据量时提高查询速度
6、order by,
查询计划解读:
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
id:一条多子句sql,子句的查询顺序,id越大优先级越高,越先执行
select_type:
system只有一行记录会出现
eq_ref索引字段能匹配到唯一的行,一般主键和唯一键的字段查询可以
ref非唯一,与eq_ref相对
range一定范围内的索引扫描,与index相对
index全部范围的索引扫描
ALL全表扫描,没走索引
possible_keys:你查询的字段可能设置了一些索引,但是where,order by等筛选条件不一定会使用这些索引
key:和possible_keys相对,就是你筛选条件实际使用的索引
key_len:这也是估算值,使用的索引长度(最大可能长度),查询并非是使用索引的全部长度
ref:
rows:这是大致估算的扫描行数
extra:一些比较重要的描述信息,使用到了索引会提示Using index
聚集索引(聚簇索引):叶子节点存储的是整行数据,主键索引就是聚集索引,
非聚集索引(普通索引、非聚簇索引、二级索引):其他的则不是,其他索引只存储索引列的数据以及主键索引
回表查询:使用非聚集索引时,为了取到具体数据,通过主键回到聚集索引里查数据,用执行计划可以看到两次查询
索引覆盖:为了减少或解决回表的一种操作,尽量在筛选条件中加上对主键的一些筛选或者排序操作,或者减少查询列,只查询添加了索引的列