一文简单了解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 pt-slave-restart工具的使用简介
Apr 07 MySQL
MySQL 数据类型选择原则
May 27 MySQL
MySQL窗口函数的具体使用
Nov 17 MySQL
如何避免mysql启动时错误及sock文件作用分析
Jan 22 MySQL
一条慢SQL语句引发的改造之路
Mar 16 MySQL
WINDOWS 64位 下安装配置mysql8.0.25最详细的教程
Mar 22 MySQL
深入理解mysql事务隔离级别和存储引擎
Apr 12 MySQL
单机多实例部署 MySQL8.0.20
May 15 MySQL
mysql 排序失效
May 20 MySQL
MySQL串行化隔离级别(间隙锁实现)
Jun 16 MySQL
MySQL8.0 Undo Tablespace管理详解
Jun 16 MySQL
MySQL事务的ACID特性以及并发问题方案
Jul 15 MySQL
为什么MySQL不建议使用SELECT *
详解MySQL的主键查询为什么这么快
MySQL表锁、行锁、排它锁及共享锁的使用详解
navicat 连接Ubuntu虚拟机的mysql的操作方法
MySQL中IO问题的深入分析与优化
mysql的Buffer Pool存储及原理
一次Mysql update sql不当引起的生产故障记录
You might like
先进的自动咖啡技术,真的可以取代咖啡师吗?
2021/03/06 冲泡冲煮
用 PHP5 轻松解析 XML
2006/12/04 PHP
整理php防注入和XSS攻击通用过滤
2015/09/13 PHP
PHP实现mysqli批量执行多条语句的方法示例
2017/07/22 PHP
PHP实现的一致性Hash算法详解【分布式算法】
2018/03/31 PHP
laravel实现按月或天或小时统计mysql数据的方法
2019/10/09 PHP
设为首页加入收藏兼容360/火狐/谷歌/IE等主流浏览器的代码
2013/03/26 Javascript
jQuery提交多个表单的小例子
2013/06/30 Javascript
基于jquery的9行js轻松实现tab控件示例
2013/10/12 Javascript
js截取字符串的两种方法及区别详解
2013/11/05 Javascript
JS 打印功能代码可实现打印预览、打印设置等
2014/10/31 Javascript
浅析javascript异步执行函数导致的变量变化问题解决思路
2016/05/13 Javascript
Bootstrap布局方式详解
2016/05/27 Javascript
Angular.JS去掉访问路径URL中的#号详解
2017/03/30 Javascript
微信小程序使用form表单获取输入框数据的实例代码
2018/05/17 Javascript
微信小程序实现的绘制table表格功能示例
2019/04/26 Javascript
vue路由守卫+登录态管理实例分析
2019/05/21 Javascript
vue-cli脚手架引入弹出层layer插件的几种方法
2019/06/24 Javascript
layui在form表单页面通过Validform加入简单验证的方法
2019/09/06 Javascript
JavaScript手写数组的常用函数总结
2020/11/22 Javascript
python中的json总结
2018/10/11 Python
python scp 批量同步文件的实现方法
2019/01/03 Python
8段用于数据清洗Python代码(小结)
2019/10/31 Python
Python GUI自动化实现绕过验证码登录
2020/01/10 Python
python 使用递归回溯完美解决八皇后的问题
2020/02/26 Python
Python写捕鱼达人的游戏实现
2020/03/31 Python
Lowe’s加拿大:家居装修、翻新和五金店
2019/12/06 全球购物
会计专业个人求职信范文
2014/01/08 职场文书
电气自动化个人求职信范文
2014/02/03 职场文书
计算机相关专业自荐信
2014/07/02 职场文书
小学生美德少年事迹材料
2014/08/24 职场文书
委托书怎样写
2014/08/30 职场文书
离婚协议书怎么写2014
2014/09/30 职场文书
2015年效能监察工作总结
2015/04/23 职场文书
小学生安全教育心得体会
2016/01/15 职场文书
HTML5 语义化标签(移动端必备)
2021/08/23 HTML / CSS