MySQL索引使用详解,原理分析
[提前声明]
文章由作者:张耀峰 结合自己生产中的使用经验整理,最终形成简单易懂的文章
写作不易,转载请注明,谢谢!
大数据代码案例地址: https://github.com/Mydreamandreality/sparkResearch
在innodb引擎中,总共有四种索引类型,两种索引方法,我主要讲一下生产中索引的选择,数据结构的选择
索引命中率,SQL执行计划可以查看我的上一篇文章
索引类型:
- 1、Normal 普通索引
- 2、Unique 唯一索引
- 3、Full Text 全文索引
- 4、SPATIAL 空间索引
索引方法:
- 1、btree索引方法
- 2、hash索引方法
索引类型详解:
- 1、首先说Normal这个索引类型,是最常用的一种索引类型了,也是最基本的一种索引类型,它本身没有任何的限制,你可以针对某个字段设置Normal,也可以做联合索引,在做单条件查询、多条件查询啊,或者其它需要left join操作的时候,MySQL优化器就会自动使用该索引类型,来优化查询速度,那如果我们要知道这个索引到底生效没有,可以使用
explain
命令来查看SQL执行计划,SQL执行计划的详解可以看我的上一篇博客哦 - 2、Unique这个顾名思义就是唯一索引,唯一索引就是在普通索引的基础上增加了唯一约束,我在百万级数据下测试,和Normal对比没有太大的性能差异,这种索引的应用场景也挺多的,比如你数据有个字段需要索引,而且这个字段的值必须是唯一的,那用Unique索引是比较好的选择
- 3、Full Text全文索引,讲道理,一般需要全文索引的我们都上Elasticsearch了,MySQL这个里面的全文索引用的确实不多,不过全文索引的基本单位肯定是词,MySQL这里面的分词器不知道有没有es那么强大,总之这种索引的应用场景就是某个字段存的大文本,你就可以使用Full Text索引
- 4、SPATIAL空间索引,说实话这个没用过,因为这个索引在innodb引擎中没法用的,需要在MYISAM引擎中空间数据类型字段上才能使用,MYSQL中的空间数据类型有4种,分别是GEOMETRY、POINT、LINESTRING、POLYGON,MYSQL使用SPATIAL关键字进行扩展,使得能够用于创建正规索引类型的语法创建空间索引,创建空间索引的列,必须将其声明为NOT NULL
索引方法详解:
索引方法这块MySQL是支持两种
- 1、BTREE就是B+树,用的最多的应该就是这种了
- 2、Hash就是K,V的数据结构,这种对范围查找,节点查找支持的不是很好
索引是啥?
大家有没有想过,索引是啥?为啥合理的加了索引后查询效率变的这么高
其实说白了,索引就是一种数据结构,它的作用就是优化我们的查询,就像是MySQL中B+树实现的索引,B+树就是一种数据结构,你没有加索引的时候查询一个数据,是需要扫描整张表,做一次全表扫描后再去匹配数据,这数据量一大不就凉了吗?索引相当于字典的音序表,如果要查某个数据,直接在音序表中找k就可以了,效率提升是很高的
那为啥说咱们推荐使用B+树的数据结构,hash索引和B树,完全平衡二叉树不行吗?
首先咱说hash索引,这种索引查找速度贼快,但是难受就难受在它不支持范围查找,比如大于等于这种,你想嘛,kv的怎么支持这种查询,所以一般情况下很少使用Hash索引
然后b树,其实光看名字哦,b树和b+树有个毛区别,不就多个+嘛,其实b+树非叶子节点冗余进了叶子节点,b+树叶子节点之间有指针,这样找大于什么或者小于什么就会特别快,是一种空间换时间的方案
平衡二叉树是支持范围查找的啊,为啥不用它,因为b+数(b数也可以)一个节点可以存放多个元素,这就导致啥?你就抽象点想,咱有两棵树,由于b+树一个节点存多个元素,是不是树长得比二叉树低,所以元素查找也要更快,减少了一定的io操作
。。。等等等等,索引可以说的点太多太多了,差不多了解一些就行了,有空再去慢慢深究
索引使用注意
- 1、索引在数据量大的时候才会有明显的效果,如果系统中数据量不大,没必要生成索引,浪费磁盘空间
- 2、索引虽然会提高查询速度,但是会降低更新速度
- 3、我听过一些比较危险的想法。。我不知道索引有没有生效,反正我给所有字段都加了索引。。。这种太吓人了,建立索引会占用磁盘空间的索引文件,你正常建立索引没啥事,不能过度使用索引
- 4、根据自己的业务场景,选择合适的索引