一、覆盖索引
尽量使用覆盖索引(查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到,查询的字段都为聚集索引或二级索引),减少select *的使用,因为可能会回表查询。
执行计划中的extra:
using index condition:查找使用了索引,但是需要回表查询数据
using where;using index:查找使用了索引,但是需要的数据都在索引列中找到,所以不需要回表查询数据。
例:id为聚集索引,name为二级索引(辅助索引)
第一条语句不需要回表查询
第二条需要回表查询,因为查询到id后还需要查询其所在的行的数据。
select id,name from tb_user where name = 'Arm';
select id,name,gender from tb_user where name = 'Arm';
二、前缀索引
当字段类型为字符串(varchar,text等)时,有时候需要索引很长的字符串,这会让索引变得很大,查询时,浪费大量的磁盘IO,影响查询效率。此时可以只将字符串的一部分前缀,建立索引,这样可以大大节约索引空间,从而提高索引效率。
语法:
create index 索引名 on 表名(字段(n));
三、单列索引与联合索引
单列索引:即一个索引只包含单个列。
联合索引:即一个索引包含了多个列。
在业务场景中,如果存在多个查询条件,考虑针对于查询字段建立索引时,建议建立联合索引。
四、索引设计原则