一文简单了解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知识点整理
Apr 05 MySQL
详细谈谈MYSQL中的COLLATE是什么
Jun 11 MySQL
MySQL系列之二 多实例配置
Jul 02 MySQL
mysql主从复制的实现步骤
Oct 24 MySQL
MySQL面试题讲解之如何设置Hash索引
Nov 01 MySQL
MySQL常见优化方案汇总
Jan 18 MySQL
MySQL如何快速创建800w条测试数据表
Mar 17 MySQL
详细聊一聊mysql的树形结构存储以及查询
Apr 05 MySQL
MySQL创建管理RANGE分区
Apr 13 MySQL
MySQL中EXPLAIN语句及用法
May 20 MySQL
MySql统计函数COUNT的具体使用详解
Aug 14 MySQL
了解MySQL查询语句执行过程(5大组件)
Aug 14 MySQL
为什么MySQL不建议使用SELECT *
详解MySQL的主键查询为什么这么快
MySQL表锁、行锁、排它锁及共享锁的使用详解
navicat 连接Ubuntu虚拟机的mysql的操作方法
MySQL中IO问题的深入分析与优化
mysql的Buffer Pool存储及原理
一次Mysql update sql不当引起的生产故障记录
You might like
PHP 5.5 创建和验证哈希最简单的方法详解
2013/11/07 PHP
PHP Try-catch 语句使用技巧
2016/02/28 PHP
XRegExp 0.2: Now With Named Capture
2007/11/30 Javascript
JavaScript 存在陷阱 删除某一区域所有节点
2010/05/10 Javascript
关于JavaScript的面向对象和继承有利新手学习
2013/01/11 Javascript
如何将一个String和多个String值进行比较思路分析
2013/04/22 Javascript
多种方式实现JS调用后台方法进行数据交互
2013/08/20 Javascript
javascript获取dom的下一个节点方法
2014/09/05 Javascript
JavaScript实现基于十进制的四舍五入实例
2015/07/17 Javascript
jQuery+css实现的时钟效果(兼容各浏览器)
2016/01/27 Javascript
Bootstrap图片轮播组件Carousel使用方法详解
2016/10/20 Javascript
Bootstrap模态框使用详解
2017/02/15 Javascript
JS简单验证上传文件类型的方法
2017/04/17 Javascript
JavaScript+CSS相册特效实例代码
2017/09/07 Javascript
解决vue打包项目后刷新404的问题
2018/03/06 Javascript
vue中,在本地缓存中读写数据的方法
2018/09/21 Javascript
微信小程序与公众号卡券/会员打通的问题
2019/07/25 Javascript
python命令行参数sys.argv使用示例
2014/01/28 Python
在Python中使用__slots__方法的详细教程
2015/04/28 Python
详解Python中的Cookie模块使用
2015/07/06 Python
python中sys.argv函数精简概括
2018/07/08 Python
Python Dataframe 指定多列去重、求差集的方法
2018/07/10 Python
一个可以套路别人的python小程序实例代码
2019/04/09 Python
结合OpenCV与TensorFlow进行人脸识别的实现
2019/10/10 Python
PYTHON如何读取和写入EXCEL里面的数据
2019/10/28 Python
Python生成词云的实现代码
2020/01/14 Python
python实现在一个画布上画多个子图
2020/01/19 Python
python Paramiko使用示例
2020/09/21 Python
HTML5中在title标题标签里设置小图标的方法
2020/06/23 HTML / CSS
自主招生自荐书
2013/11/29 职场文书
工商治理实习生的自我评价分享
2014/02/20 职场文书
关于梦想的演讲稿
2014/05/05 职场文书
2016新年问候语大全
2015/11/11 职场文书
Html5新增了哪些功能
2021/04/16 HTML / CSS
Python面向对象编程之类的概念
2021/11/01 Python
MySQL数据库 安全管理
2022/05/06 MySQL