一文简单了解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 相关文章推荐
教你用eclipse连接mysql数据库
Apr 22 MySQL
MYSQL主从数据库同步备份配置的方法
May 26 MySQL
浅谈MySQL 亿级数据分页的优化
Jun 15 MySQL
SQL实现LeetCode(178.分数排行)
Aug 04 MySQL
MySQL空间数据存储及函数
Sep 25 MySQL
weblogic服务建立数据源连接测试更新mysql驱动包的问题及解决方法
Jan 22 MySQL
SQL注入篇学习之盲注/宽字节注入
Mar 03 MySQL
浅谈MySQL中的六种日志
Mar 23 MySQL
mysql的单列多值存储实例详解
Apr 05 MySQL
MySQL创建管理LIST分区
Apr 13 MySQL
mysql序号rownum行号实现方式
Dec 24 MySQL
为什么MySQL不建议使用SELECT *
详解MySQL的主键查询为什么这么快
MySQL表锁、行锁、排它锁及共享锁的使用详解
navicat 连接Ubuntu虚拟机的mysql的操作方法
MySQL中IO问题的深入分析与优化
mysql的Buffer Pool存储及原理
一次Mysql update sql不当引起的生产故障记录
You might like
Linux下手动编译安装PHP扩展的例子分享
2014/07/15 PHP
PHP实现自动识别Restful API的返回内容类型
2015/02/07 PHP
详谈PHP面向对象中常用的关键字和魔术方法
2017/02/04 PHP
PHP开发中解决并发问题的几种实现方法分析
2017/11/13 PHP
thinkPHP事务操作简单案例分析
2019/10/17 PHP
PHP7 参数处理机制修改
2021/03/09 PHP
用javascript实现画板的代码
2007/09/05 Javascript
js点击页面其它地方将某个显示的DIV隐藏
2012/07/12 Javascript
jQuery动态设置form表单的enctype值(实现代码)
2013/07/04 Javascript
javascript模拟实现C# String.format函数功能代码
2013/11/25 Javascript
标题过长使用javascript按字节截取字符串
2014/04/24 Javascript
使用AngularJS编写较为优美的JavaScript代码指南
2015/06/19 Javascript
Angularjs material 实现搜索框功能
2016/03/08 Javascript
jquery对dom节点的操作【推荐】
2016/04/15 Javascript
微信小程序 页面传参实例详解
2016/11/16 Javascript
实例浅析js的this
2016/12/11 Javascript
JS实现一次性弹窗的方法【刷新后不弹出】
2016/12/26 Javascript
jQuery实现倒计时功能 jQuery实现计时器功能
2017/09/19 jQuery
使用nodejs+express实现简单的文件上传功能
2017/12/27 NodeJs
JS事件绑定的常用方式实例总结
2019/03/02 Javascript
解决js中的setInterval清空定时器不管用问题
2020/11/17 Javascript
[01:28:43]2014 DOTA2华西杯精英邀请赛5 24 DK VS CIS
2014/05/25 DOTA
python socket网络编程之粘包问题详解
2018/04/28 Python
Python实现手写一个类似django的web框架示例
2018/07/20 Python
对Pandas DataFrame缺失值的查找与填充示例讲解
2018/11/06 Python
python爬虫 基于requests模块的get请求实现详解
2019/08/20 Python
python Tensor和Array对比分析
2020/01/08 Python
Python实现投影法分割图像示例(二)
2020/01/17 Python
中专毕业生求职简历的自我评价
2013/10/21 职场文书
幼儿园门卫岗位职责
2014/02/14 职场文书
2015年世界无烟日演讲稿
2015/03/18 职场文书
中学生国庆节演讲稿2015
2015/07/30 职场文书
加薪申请书应该这样写!
2019/07/04 职场文书
pytorch中F.avg_pool1d()和F.avg_pool2d()的使用操作
2021/05/22 Python
html中显示特殊符号(附带特殊字符对应表)
2021/06/21 HTML / CSS
SpringBoot实现异步事件驱动的方法
2021/06/28 Java/Android