SQL提示
user 建议其使用哪个索引
select *from tb user index(xx) where pro = '';
ognore 忽略其索引使用
select *from tb agnore index(xx) where pro = '';
force 强制其使用索引
select * from tb force index(xx) where pro = '';
覆盖索引和回表查询
覆盖索引
尽量使用覆盖索引(查询使用了索引,并且需要返回的列,在该索引中,已经全部找到),减少select*。
回表查询
以每个字段为建立的索引(包括联合索引),在此索引表找不到需要返回的数据,就需要从聚集索引中查找,这个过程叫做回表查询。
前缀索引
当字段类型为字符串(varchar、text等)时,有时候需要索引很长的字符串,这会让索引变得很大,查询时,浪费大量的磁盘IO,影响查询效率。此时可以只将字符串的一部分前缀,建立索引,这样大大节约索引空间,从而提高效率。
#建立前缀索引语法
create index idx_xxx on table_name(column(n))
索引长度
可以根据索引的选择性来确定,而选择性指不重复的索引值和数据表的记录总数的比值,索引选择性越高查询效率越高,唯一索引的选择性为1,最好的索引,性能最好。
查询某字段数值不重复
#不重复distinct
select count(distinct email) from tb_name;
#选择性
select count(distinct email)/count(*) from tb_name;
单列联合索引
单列索引:即一个索引只包含单个列
联合索引:即一个索引包含多个列
业务场景 ,查询多个字段,优先使用联合索引
索引设计原则
- 数据量大,且查询比较频繁的表建立索引
- 针对常作为查询条件,排序,分组操作的字段建立索引
- 选择区分度高的建立索引,区分度高,查询效率高
- 字符串类型,尽量选择前缀索引
- 尽量使用联合索引
- 控制索引数量,占据磁盘
- 索引列的null,使用not null约束,有助于数据库自我识别
网友评论