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、使用列的类型小的创建索引