Mysql索引的创建与设计原则

90 阅读4分钟

MySQL中SQL的执行流程

客户端-----》访问的查询缓存-----》解析器-----》语法解析-----》生成解析树-----》预处理器-----》新解析树-----》查询优化器(sql优化)-----》执行计划-----》查询执行引擎-----》API接口查询-----》

Mysql索引的创建与设计原则

1、创建表时创建

2、使用alter table

alter table 表明 add (索引类型) index 索引名称(一般以什么索引_字段名) (字段名)

3、create index ... on ...

create index 索引名 on 表名(字段名)

查看索引

show index from 表名

2、删除索引

1、alter table ... drop index ...
alter table 表名 drop index 索引名

提示:添加了auto_increment约束字段的唯一索引不能被删除。

2、drop index ... on ...
drop index 索引名 on 表名(字段名)

提示:删除字段,即删除索引(索引绑定字段)

mysql8.0索引新特性

1、支持降序索引

2、隐藏索引

3.索引的设计原则

3.2那些情况是个创建索引

1、字段的数值有唯一性的限制

索引本身可以起到约束的作用,比如唯一索引、主键索引都是可以起到唯一性约束的,因此在我们的数据表中,如果某个字段是唯一性的,就可以直接创建唯一性索引,或者主键索引。这样可以更快速地通过该索引来确定某条记录。

例如,学生表中学号是具有唯一性的字段,为该字段建立唯一性索引课可以很快确定某个学生的信息,如果使用姓名的话,可能存在同名现象,从而降低查询速度。

业务上具有唯一特性的字段,即使是组合字段,也必须建成唯一索引。(来源:Alibaba)

说明:不要以为唯一索引影响了insert速度,这个速度损耗可以忽略,但提高查找速度是明显的。

2、频繁作为where查询条件的字段

3、经常group by 和 order by的列

4、update、delete的where条件列

5、distinct字段需要创建索引

6、多表join连接操作时,创建索引注意事项

首先,连接表的数量尽量不要超过三张,因为每增加一张表就相当于增加了一次嵌套的循环,数量级增长会非常快,严重影响查询的效率(一张表n,两张表n2次方,三张表n3次方)。

其次,对where条件创建索引,因为where才是对数据条件的过滤。如果在数据量非常大的情况下,没有where条件过滤时非常可怕的。

最后,对用于连接的字段创建索引,并且该字段在多张表中的类型必须一致。比如course_id在student_info表和course表中都为int(11)类型,而不能一个为int另一个为varchar类型(原因:内部会使用函数隐式转换成数字进行比对,就会导致索引失效)。

7、使用列的类型小的创建索引

我们在定义表结构的时候要显式的指定列的类型,已整数类型为例,有tinyint、mediumint、int、bigint等,它们占用的存储空间一次递增,能表示的整数范围当然也是依次递增。如果我们想要对某个整数列建立索引的话,在表示的整数范围允许的情况下,尽量让索引列使用较小的类型,比如我们能使用int就不要使用bigint,能使用mediumint就不要使用int。这是因为;

  • 数据类型越小,在查询时进行的比较操作就越快
  • 数据类型越小,索引占用的存储空间就越小,在一个数据页就可以放下更多的记录,从而减少磁盘I/O带来的性能损耗,也就意味着可以把更多的数据页缓存在内存中,从而加快读写效率。

这个建议对于表的主键来说更加适用,因为不仅是聚簇索引中会存储主键值,其他所有二级索引的节点处都会存储一份记录的主键值,如果主键使用更小的数据类型,也就意味着节省更多的存储空间和更高效的I/O.

8、使用字符串前缀创建索引

注意:使用前缀索引就无法order by 索引排,只能使用文件排序。

9、区分度高(散列性高)的列适合作为所以i你

10、使用列的类型小的创建索引