sql优化篇

发布时间 2023-07-13 14:54:55作者: 时间羚羊

简单优化:

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

 

聚集索引(聚簇索引):叶子节点存储的是整行数据,主键索引就是聚集索引,

非聚集索引(普通索引、非聚簇索引、二级索引):其他的则不是,其他索引只存储索引列的数据以及主键索引

回表查询:使用非聚集索引时,为了取到具体数据,通过主键回到聚集索引里查数据,用执行计划可以看到两次查询

索引覆盖:为了减少或解决回表的一种操作,尽量在筛选条件中加上对主键的一些筛选或者排序操作,或者减少查询列,只查询添加了索引的列