MySQL索引怎么用?究竟能有多快?看完这篇你就懂了

 

MySQL索引怎么用?究竟能有多快?看完这篇你就懂了

文章插图
 
为了能让索引能有更直观的效率,我在一张表里扔进了百万条数据(光靠这些数据,生成数据代码写了一个小时,解决MySQL8的文件导入权限问题解决了两个小时,导入数据花费了一个小时,我太难了~(;д;) 。但是,一切不以实践数据为标准的理论都是**耍!流!氓!**o(´^`)o) 。让我们一边讲解MySQL的使用一边看一下索引能为我们的查询带来的性能提升吧 。
索引使用的优势提高查询效率,简单来说就是查的快!再快!更快!外面说的什么提高表的速度、加速表连接、减少分组及排序时间、提高系统性能,说白了都是快,查得快!(顺便我发现百度出来的索引使用优势劣势貌似就那么一两套,真就天下文章一大抄呗,抄我的也欢迎,烦请注明出处或者作者Solid_lele哈)
具体会有多快呢?
这是没有索引的百万级数据查找(这个算快的了,慢的四十秒,时间不是很稳定,因为是从磁盘块中读取数据,原理参照我开头提到的那篇文章)10.797s:
MySQL索引怎么用?究竟能有多快?看完这篇你就懂了

文章插图
 
这是有索引的百万级数据查找0.272s:
MySQL索引怎么用?究竟能有多快?看完这篇你就懂了

文章插图
 
差了四十多倍,就相当于别人一年赚四十多万,我一年赚一万,这差距真的是太痛苦了 。
索引使用的劣势凡事具有两面性,有好就会有坏,拿时间换空间或者拿空间换时间这种操作屡见不鲜,索引就是拿空间换时间,虽然并不是那么典型(因为它核心并不是增大空间减少时间,而是通过维护类似目录的结构减少IO的读写次数,最典型的空间换时间是计数排序) 。坏处自然就出现了:
1、维护成本高索引维护了一个类似于目录的结构,你可以联想新华字典的目录,当你创建目录的时候,如果没有程序帮忙,你自己手写目录的话,需要一页一页的去翻去看确定那个字在哪儿,然后写进目录里;万一有个字被删了或者加了一个字还要重新调整一遍目录 。对程序也是一样,索引的创建和维护是需要消耗性能的,所以会降低数据库修改时的性能 。就以创建索引来说,创建百万级别的varchar数据BTREE索引,数据内容长度为20个汉字,消耗的时间为61.234s:
MySQL索引怎么用?究竟能有多快?看完这篇你就懂了

文章插图
 
再比较一下维护索引的代价,比如无索引百万级别数据插入一条时间为0.480s:
MySQL索引怎么用?究竟能有多快?看完这篇你就懂了

文章插图
 
而有索引的百万级别数据插入一条时间为1.273s:
MySQL索引怎么用?究竟能有多快?看完这篇你就懂了

文章插图
 
差距其实还挺大的(请忽略我乱打插入的三个字) 。
2、所占空间大既然提到空间换时间,那么空间的浪费是不可避免的,我做了下面的这个测试(测试数据库MySQL8,数据库运行环境windows) 。
首先创建了一个临时表tmp_name,其中只有一列名为c_name的字段,发现文件夹中存储的ibd文件初始大小为112k,插入百万条数据(100万条数据整哦,一个不多一个不少哦)后,大小为40960k:
MySQL索引怎么用?究竟能有多快?看完这篇你就懂了

文章插图
 
然后创建了一个BTREE索引,大小变为了73728k:
MySQL索引怎么用?究竟能有多快?看完这篇你就懂了

文章插图
 
大约多用了一倍的空间 。但实际中不可能每个字段都加索引,生产中为索引预留的空间大概占数据大小的五分之一就够了 。在这个数据为重效率至上的时代,磁盘的空间成本貌似还是比较划算的 。
其实使用索引还有个劣势,就是你需要花费时间来看我这篇文章o(


    推荐阅读