一文简单了解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 相关文章推荐
仅用一句SQL更新整张表的涨跌幅、涨跌率的解决方案
May 06 MySQL
详解MySQL主从复制及读写分离
May 07 MySQL
MYSQL 无法识别中文的永久解决方法
Jun 03 MySQL
解析MySQL binlog
Jun 11 MySQL
MySQL如何解决幻读问题
Aug 07 MySQL
MySQL图形化管理工具Navicat安装步骤
Dec 04 MySQL
MySQL限制查询和数据排序介绍
Mar 25 MySQL
MySQL创建管理LIST分区
Apr 13 MySQL
MySQL视图概念以及相关应用
Apr 19 MySQL
MySQL中order by的执行过程
Jun 05 MySQL
MySQL控制流函数(-if ,elseif,else,case...when)
Jul 07 MySQL
MySQL性能指标TPS+QPS+IOPS压测
Aug 05 MySQL
为什么MySQL不建议使用SELECT *
详解MySQL的主键查询为什么这么快
MySQL表锁、行锁、排它锁及共享锁的使用详解
navicat 连接Ubuntu虚拟机的mysql的操作方法
MySQL中IO问题的深入分析与优化
mysql的Buffer Pool存储及原理
一次Mysql update sql不当引起的生产故障记录
You might like
聊天室php&amp;mysql(一)
2006/10/09 PHP
将博客园(cnblogs.com)数据导入到wordpress的代码
2013/01/06 PHP
php中的mongodb select常用操作代码示例
2014/09/06 PHP
PHP7 安装event扩展的实现方法
2019/10/08 PHP
让你的PHP,APACHE,NGINX支持大文件上传
2021/03/09 PHP
js将当前时间格式转换成时间搓(自写)
2013/09/26 Javascript
javascript alert乱码的解决方法
2013/11/05 Javascript
为什么JS中eval处理JSON数据要加括号
2015/04/13 Javascript
JavaScript编写Chrome扩展实现与浏览器的交互及时间通知
2016/05/16 Javascript
精彩的Bootstrap案例分享 重点在注释!(选项卡、栅格布局)
2016/07/01 Javascript
微信公众平台开发教程(五)详解自定义菜单
2016/12/02 Javascript
JavaScript实现获取用户单击body中所有A标签内容的方法
2017/06/05 Javascript
浅谈react-native热更新react-native-pushy集成遇到的问题
2017/09/30 Javascript
VUE 实现复制内容到剪贴板的两种方法
2019/04/24 Javascript
在weex中愉快的使用scss的方法步骤
2020/01/02 Javascript
vue中解决拖拽改变存在iframe的div大小时卡顿问题
2020/07/22 Javascript
[01:17]炒鸡美酒第四天TA暴走
2018/06/05 DOTA
python的dict,set,list,tuple应用详解
2014/07/24 Python
python保存网页图片到本地的方法
2018/07/24 Python
pandas.DataFrame删除/选取含有特定数值的行或列实例
2018/11/07 Python
Django框架模板注入操作示例【变量传递到模板】
2018/12/19 Python
Python GUI编程 文本弹窗的实例
2019/06/11 Python
使用Python实现牛顿法求极值
2020/02/10 Python
Virtualenv 搭建 Py项目运行环境的教程详解
2020/06/22 Python
pycharm全局搜索的具体步骤
2020/07/28 Python
浅谈关于html5中图片抛物线运动的一些心得
2018/01/09 HTML / CSS
HTML5拖拽功能实现的拼图游戏
2018/07/31 HTML / CSS
英国女性时尚品牌:Apricot
2018/12/04 全球购物
澳大利亚排名第一的露营和户外设备在线零售商:Outbax
2020/05/06 全球购物
小学二年级评语
2014/04/21 职场文书
教师国庆节演讲稿范文2014
2014/09/21 职场文书
县长“四风”对照检查材料思想汇报
2014/10/05 职场文书
房屋登记授权委托书范本
2014/10/09 职场文书
开学随笔
2015/08/15 职场文书
Python编写nmap扫描工具
2021/07/21 Python
日元符号 ¥
2022/02/17 杂记