【mysql】索引有关的问题

本文是自己学习的一些总结,比较口语化,主要是为了加强记忆,和希望与大家分享。欢迎大佬们批判和指正!

索引的数据结构,按照不同的类型来分:

数据结构:B+树,Hash,full_text

物理存储:聚簇索引、二级索引

字段特性:主键索引、唯一索引、前缀索引

字段个数:单列索引、联合索引

创建主键索引和二级索引默认使用B+树,B+树的叶子节点存放数据,非叶子节点只存放索引,叶子节点之间是双向链表相连,适用于mysql中常见的基于范围的顺序查找。

联合索引是符合最左匹配原则的,它在遇到> 、<范围匹配时会失效;而遇到>=、<=、like、between时不会失效。mysql5.6后使用了索引下推。

索引区分度:如果一个字段它的重复数据太多,比如达到30%,就算这个字段建立了索引,也不会走索引而是走全表扫描。

索引存在的缺点:

需要占用物理内存空间

是需要耗费时间去动态维护索引的,而且数据量越大耗费的时间越多。

在发生update操作时,需要去动态维护

会降低表的增删改的效率

适用场景:

字段有唯一约束的

where子句的条件字段

group by和order by字段

不适用场景:

不用于where子句的字段

字段中有大量数据是重复的

表数据太少

经常修改的字段

建议主键自增

如果主键自增的话,插入数据时追加的操作,不需要重新移动数据,效率高。因为随意插入可能插入到已经存在数据的页,那就需要移动其它数据来满足插入,甚至需要复制数据到另一个页。这个被称为页分裂。页分裂还可能造成大量的内存碎片,导致索引结构不紧凑,从而影响查询效率。

建议索引字段为not null

一个是如果索引字段为null的话,那么在优化器优化的时候,是很影响效率。在做索引,索引比较,值比较的时候都比较困难。而是null字段在记录数据的时候,会记录到记录额外信息的列表上。

索引失效

使用左或者左右模糊匹配的时候

在查询条件中,对索引列进行了计算,函数,类型转换等操作时

使用了联合索引,不遵守最左匹配规则时

where子句中,如or前面是索引列而后面不是索引列时

Mysql 文章被收录于专栏

本专栏是本人学习mysql的一些总结,也欢迎大家评论区留言讨论交流~

全部评论

相关推荐

09-22 09:42
门头沟学院 Java
牛客37185681...:马德,我感觉这是我面过最恶心的公司,一面是两个女hr,说什么实习前几个月属于试用期,试用期过了才能转成正式实习生,我***笑了,问待遇就是不说,问能不能接受全栈,沙币公司
如果可以选,你最想去哪家...
点赞 评论 收藏
分享
评论
3
6
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务