一文简单了解MySQL前缀索引


Posted in MySQL onApril 03, 2022

当要索引的列字符很多时 索引则会很大且变慢

( 可以只索引列开始的部分字符串 节约索引空间 从而提高索引效率 )

原则: 降低重复的索引值

例如现在有一个地区表

area gdp code
chinaShanghai 100 aaa
chinaDalian 200 bbb
usaNewYork 300 ccc
chinaFuxin 400 ddd
chinaBeijing 500 eee

发现 area 字段很多都是以 china 开头的

那么如果以前1-5位字符做前缀索引就会出现大量索引值重复的情况

索引值重复性越低 查询效率也就越高

前缀索引测试

// 创建一个测试表
CREATE TABLE `x_test` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `x_name` varchar(255) NOT NULL,
  `x_time` int(10) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4145025 DEFAULT CHARSET=utf8mb4

// 添加200万条测试数据
INSERT INTO x_test(x_name,x_time) SELECT CONCAT(rand()*3300102,x_name),x_time FROM x_test WHERE id < 30000;

一文简单了解MySQL前缀索引

200万 测试数据

  • 在无任何索引的情况下随便查询一条
    SELECT * FROM x_test WHERE x_name = '1892008.205824857823401.800099203178258.8904820949682635656.62526521254';查询时间:2.253s

  • 添加前缀索引 ( 以第一位字符创建前缀索引 )
    alter table x_test add index(x_name(1))再次查询相同sql语句
    SELECT * FROM x_test WHERE x_name = '1892008.205824857823401.800099203178258.8904820949682635656.62526521254';查询时间:3.291s
    当使用第一位字符创建前缀索引后 貌似查询的时间更长了
    因为只第一位字符而言索引值的重读性太大了
    200万条数据全以数字开头那么平均20万条的数据都是相同的索引值

  • 重新建立前缀索引 这次以前4位字符来创建
    alter table x_test add index(x_name(4));再次查询相同sql语句
    SELECT * FROM x_test WHERE x_name = '1892008.205824857823401.800099203178258.8904820949682635656.62526521254';查询时间:0.703s
    这次以前4位创建索引 大大减少了索引值的重复性 查询速度从3秒提升到0.7秒

  • 200万条数据都以数字开头 而0-9排列组合7位则可达到千万种组合
    也就是以前7位来做索引则不会出现重复索引值的情况了
    alter table x_test add index(x_name(7));再次查询相同sql语句
    SELECT * FROM x_test WHERE x_name = '1892008.205824857823401.800099203178258.8904820949682635656.62526521254';查询时间:0.014s ( 首次执行无缓存状态下 )

补充:使用前缀索引的执行过程

  1. 从index2的索引树上,找到满足索引值是“zhangs”的记录,找到第一个是ID1;
  2. 到主键索引树上查到ID1这一行,判断email的值满不满足where后的条件,不满足这一行丢弃。
  3. 继续回到index2这个索引树上查下一条记录,发现如果还是"zhangs",取出ID2,再回到ID2索引树上进行判断,如果值正确,将结果返回结果集中。
  4. 重复执行以上流程,直到从index2索引树上取出的数据不是“zhangs”,循环结束。

通过以上执行流程的分析你就可以知道,前缀索引会导致扫描的行数变多,这和你所指定前缀的长度有关。或许email(7)中的区分度就比email(6)高,就不会扫描那么多行。

也即是说使用前缀索引,定义好长度,就可以节省空间又不用额外增加太多的查询成本

那怎样定义前缀索引长度比较好呢?

实际上,建立索引时关注的是区分度,区分度越高,越能体现索引的价值和他的优势。因此我们可以通过统计索引上有不同的值来判断要使用多长的前缀。

select count(distinct email) as L from User;

MySQL 5.7 参考手册 - 前缀索引

总结

到此这篇关于MySQL前缀索引的文章就介绍到这了,更多相关MySQL前缀索引内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
详解MySQL多版本并发控制机制(MVCC)源码
Jun 23 MySQL
MySQL中utf8mb4排序规则示例
Aug 02 MySQL
SQL实现LeetCode(176.第二高薪水)
Aug 04 MySQL
MySQL令人大跌眼镜的隐式转换
Aug 23 MySQL
Mysql案例刨析事务隔离级别
Sep 25 MySQL
mysql函数全面总结
Nov 11 MySQL
MySQL图形化管理工具Navicat安装步骤
Dec 04 MySQL
MySQL如何使备份得数据保持一致
May 02 MySQL
MySQL批量更新不同表中的数据
May 11 MySQL
MySQL如何修改字段类型和字段长度
Jun 10 MySQL
mysql sock 文件解析及作用讲解
Jul 15 MySQL
MySQL新手入门进阶语句汇总
Sep 23 MySQL
为什么MySQL不建议使用SELECT *
详解MySQL的主键查询为什么这么快
MySQL表锁、行锁、排它锁及共享锁的使用详解
navicat 连接Ubuntu虚拟机的mysql的操作方法
MySQL中IO问题的深入分析与优化
mysql的Buffer Pool存储及原理
一次Mysql update sql不当引起的生产故障记录
You might like
PHP 数组和字符串互相转换实现方法
2013/03/26 PHP
PHP计算数组中值的和与乘积的方法(array_sum与array_product函数)
2016/04/01 PHP
PHP安全下载文件的方法
2016/04/07 PHP
javascript的原生方法获取数组中的最大(最小)值
2012/12/19 Javascript
Jquery easyui 下loaing效果示例代码
2013/08/12 Javascript
javascript数组快速打乱重排的方法
2014/01/02 Javascript
js加载读取内容及显示与隐藏div示例
2014/02/13 Javascript
JavaScript数组深拷贝和浅拷贝的两种方法
2014/04/16 Javascript
js类定义函数时用prototype与不用的区别示例介绍
2014/06/10 Javascript
javascript面向对象特性代码实例
2014/06/12 Javascript
JavaScript实现动画打开半透明提示层的方法
2015/04/21 Javascript
js焦点文字滚动效果代码分享
2015/08/25 Javascript
jquery中cookie用法实例详解(获取,存储,删除等)
2016/01/04 Javascript
bootstrap的3级菜单样式,支持母版页保留打开状态实现方法
2016/11/10 Javascript
JavaScript中数据类型转换总结
2016/12/25 Javascript
codeMirror插件使用讲解
2017/01/16 Javascript
Parcel 打包示例(React HelloWorld)
2018/01/16 Javascript
详解js 创建对象的几种方法
2019/03/08 Javascript
[06:01]刀塔次级联赛top10第一期
2014/11/07 DOTA
对python添加模块路径的三种方法总结
2018/10/16 Python
Python实现多属性排序的方法
2018/12/05 Python
详解python中TCP协议中的粘包问题
2019/03/22 Python
Python with用法:自动关闭文件进程
2019/07/10 Python
python多线程高级锁condition简单用法示例
2019/11/07 Python
Python模拟键盘输入自动登录TGP
2020/11/27 Python
Django与AJAX实现网页动态数据显示的示例代码
2021/02/24 Python
web页面录屏实现
2019/02/12 HTML / CSS
个人自我鉴定总结
2014/03/25 职场文书
学生会部长竞聘书
2014/03/31 职场文书
怎样写辞职信
2015/02/27 职场文书
计划生育目标责任书
2015/05/09 职场文书
教师师德工作总结2015
2015/07/22 职场文书
公司管理建议书
2015/09/14 职场文书
三年级作文之小小梦想
2019/12/06 职场文书
MySQL表的增删改查基础教程
2021/04/07 MySQL
吃通javascript正则表达式
2021/04/21 Javascript