在网上看了不少关于索引的文章,也在知乎上看了不少,要么就是太简单,不怎么好理解;要么就是太复杂,根本不知道你想表达什么呀亲.所以我决定自己写一遍关于索引的博客,如有错误,请大家批评指正,谢谢.
一.首先我们需要明确的第一个概念就是索引是什么.
对于一个MySQL DBA来说,在MySQL数据库中查询想要的数据然后查看或者修改它,使我们每天都要重复的事情.既然我们是做MySQL DBA的或者做与MySQL数据库相关工作的,那么相信对于相率来讲,我们应该都有着极度苛刻的要求.其实这也是我们要建立主键和索引的原因了.因为在我看来我恨不得在查找数据时,我需要几行它就能给我查找几行,也就是说查询效率100%.
二.要在什么情况下建立索引呢?
在解决这个问题之前我想吸纳谈谈主键.众所周知比起来让sql语句执行时在索引上去查找我们更愿意让它在主键上去找,这样的效率我想也是最高的.所以索引的建立往往是在我们对一列数据经常进行查找,但这一列又不是主键的基础上来建立的.
三.那么索引那么好用为什么不多在几个列上创建索引呢?
1.索引是占空间的,我们既然要求数据库具备更高的性能,我们就应该多去考虑空间的使用情况
2.索引太多容易造成查询数据时发生混乱比如在你向一个已经建立好的索引表中执行insert或者update时,我们知道索引因为它是给你所创建的这一列数据进行排序后才变快的,所以当执行一天语句之后他有可能会因为多个索引都要给他排序而造成的内存的滥用和IO的增加(索引排序是在内存空间进行的,发生物理读,所以表里面的索引越多,造成的影响也就一目了然了).
3.创建索引会发生全表扫描,一般来讲数据库一旦开始上线运行,我们对他的期待就是直到这个产品的生命周期结束数据库都能一直不发生故障,所以很显然如果随意的在一个表中的多个列上建立索引,极有可能因为数据库发生了全表扫描和排序造成对数据库亢住甚至致命的影响.
四.自适应hash索引
1.什么是自适应hash索引呢?
当我们建立的索引在数据库中被频繁访问使用时,这个二级索引就会变成一个热索引,就像innodb_buffer_pool中的热数据一样.此时hash索引就会被触发,将这个索引放到hash索引里面去,当这个索引生成到hash索引里面去之后,这个索引就不再是按照树高一级一级的查找了,而是直接根据sql语句所对应的where条件来查找.
优点:
1.没有树高
2.查找速度更快,更加准确
3.极端情况下,比较的意义是可以降低逻辑读
缺点:
1.不能够进行范围查找,只能进行一对一的精确查找.
2.会占用innodb_buffer_pool中的内存(linux系统中一切皆文件,所以索引也是以.index表的形式存储在磁盘中的文件,所以索引的调用就是文件的调用,所以会占用内存)
欢迎大家评论指正
作者联系方式:
email:mxker163@163.com