MySQL调优系列:如何正确的使用MySQL索引

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、根据自己的业务场景,选择合适的索引

你可能感兴趣的:(SQL优化,一文读懂系列)