MySQL支持前缀索引,也就是说你可以定义一个字符串的一部分作为索引。下面这篇文章主要介绍MySQL前缀索引的相关信息,有需要的朋友可以参考一下。
当要索引的列字符很多时,索引会很大且很慢。
(为了节省索引空间和提高索引效率,可以只对列开头的部分字符串进行索引)
原则:减少重复的索引值
比如现在有一个地区表。
areagdpcodechina Shanghai 100 aaaachina Dalian 200 bbbusanewyork 300 ccccchina Fuxin 400 DDC China Beijing 500 eee
发现很多领域都是从中国开始的。
如果将前面的1-5个字符用作前缀索引,将会有大量的索引值重复。
索引重复性越低,查询效率越高。
前缀索引测试
//创建一个测试表
创建表` x_test `(
` id ' int(11)unsigned NOT NULL AUTO _ INCREMENT,
` x_name` varchar(255)不为空,
` x_time` int(10)不为空,
主键(` id `)
)ENGINE=InnoDB AUTO _ INCREMENT=4145025默认字符集=utf8mb4
//添加200万条测试数据
INSERT INTO x_test(x_name,x _ time)SELECT CONCAT(rand()* 3300102,x_name),x _ time FROM x _ test WHERE id 30000
20万测试数据
查询一个没有任何索引的。
SELECT * FROM x_test,其中x _ name=查询时间:2.253秒
添加前缀索引(用第一个字符创建前缀索引)
alter table x _ test add index(x _ name(1))再次查询同一个sql语句。
SELECT * FROM x_test,其中x _ name=查询时间:3.291秒
当用第一个字符创建前缀索引时,似乎查询时间更长。
因为只有索引值的第一个字符太重读了。
20万条数据都是以数字开头的,所以平均下来,20万条数据都有相同的索引值。
重新建立前缀索引。这一次,通过前4个字符创建它。
alter table x_test添加索引(x _ name(4));再次查询相同的sql语句
SELECT * FROM x_test,其中x _ name=查询时间:0.703秒
之前的4位索引创建大大降低了索引值的重复查询速度,从3秒降低到0.7秒。
20万条数据全部以数字开头,0-9的7位可以排列组合达到千万种组合。
也就是说,如果前面的7位用于索引,则不会有重复的索引值。
alter table x_test添加索引(x _ name(7));再次查询相同的sql语句
SELECT * FROM x_test,其中x _ name=查询时间:0.014秒(第一次无缓存状态)
补充:使用前缀索引的执行过程
从index2的索引树中,找到索引值为“丈”的记录,发现第一条是ID1;在主键索引树中找到行ID1,判断email的值是否满足where之后的条件,不满足则丢弃。回到index2的索引树查看下一条记录,发现还是'丈',就把ID2拿出来,再回到ID2的索引树进行判断。如果值正确,结果将返回到结果集。重复上述过程,直到从index2索引树中检索到的数据不是“丈”,循环结束。
从上面的执行过程分析,可以知道前缀索引会导致扫描更多的行,这和你指定的前缀长度有关。可能email(7)的区分度比email(6)高,那么多行就不扫描了。
也就是说,通过使用前缀索引并定义长度,可以在不增加太多查询成本的情况下节省空间。
如何定义前缀索引的长度?
其实在建立指数的时候,关注的是区分度。区分度越高,越能体现指数的价值和优势。所以我们可以通过统计索引中不同的值来判断前缀要用多长。
选择count(独特的电子邮件)作为来自用户的L;
MySQL 5.7参考手册-前缀索引
总结
关于MySQL前缀索引的这篇文章到此为止。关于MySQL前缀索引的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望你以后能支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。