一文简单了解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 Show Profile
Apr 05 MySQL
MySQL sql_mode的使用详解
May 08 MySQL
MySQL主从搭建(多主一从)的实现思路与步骤
May 13 MySQL
MySQL时间盲注的五种延时方法实现
May 18 MySQL
Mysql数据库按时间点恢复实战记录
Jun 30 MySQL
MySQL高速缓存启动方法及参数详解(query_cache_size)
Jul 01 MySQL
SQL之各种join小结详细讲解
Aug 04 MySQL
详细聊聊关于Mysql联合查询的那些事儿
Oct 24 MySQL
MYSQL如何查看进程和kill进程
Mar 13 MySQL
MySQL三种方式实现递归查询
Apr 18 MySQL
MySQL的存储过程和相关函数
Apr 26 MySQL
mysqldump进行数据备份详解
Jul 15 MySQL
为什么MySQL不建议使用SELECT *
详解MySQL的主键查询为什么这么快
MySQL表锁、行锁、排它锁及共享锁的使用详解
navicat 连接Ubuntu虚拟机的mysql的操作方法
MySQL中IO问题的深入分析与优化
mysql的Buffer Pool存储及原理
一次Mysql update sql不当引起的生产故障记录
You might like
syphon 虹吸式咖啡冲泡冲煮倒水的得与失
2021/03/03 冲泡冲煮
PHPMailer邮件类利用smtp.163.com发送邮件方法
2008/09/11 PHP
php使用smtp发送支持附件的邮件示例
2014/04/13 PHP
如何在node的express中使用socket.io
2014/12/15 Javascript
如何减少浏览器的reflow和repaint
2015/02/26 Javascript
js实现同一页面多个运动效果的方法
2015/04/10 Javascript
WEB前端开发都应知道的jquery小技巧及jquery三个简写
2015/11/15 Javascript
jQuery实现可拖拽3D万花筒旋转特效
2017/01/03 Javascript
JavaScript上传文件时不用刷新页面方法总结(推荐)
2017/08/15 Javascript
Vue的实例、生命周期与Vue脚手架(vue-cli)实例详解
2017/12/27 Javascript
详解如何用babel转换es6的class语法
2018/04/03 Javascript
vue监听键盘事件的快捷方法【推荐】
2018/07/11 Javascript
CKEditor4配置与开发详细中文说明文档
2018/10/08 Javascript
修改layui的后台模板的左侧导航栏可以伸缩的方法
2019/09/10 Javascript
解决微信小程序scroll-view组件无横向滚动的问题
2020/02/04 Javascript
Vuex的各个模块封装的实现
2020/06/05 Javascript
js前端对于大量数据的展示方式及处理方法
2020/12/02 Javascript
基于python的字节编译详解
2017/09/20 Python
python爬虫简单的添加代理进行访问的实现代码
2019/04/04 Python
Python实现朴素贝叶斯的学习与分类过程解析
2019/08/24 Python
python实现的接收邮件功能示例【基于网易POP3服务器】
2019/09/11 Python
pyqt5 QScrollArea设置在自定义侧(任何位置)
2019/09/25 Python
python将图片转base64,实现前端显示
2020/01/09 Python
python3 字符串知识点学习笔记
2020/02/08 Python
Django --Xadmin 判断登录者身份实例
2020/07/03 Python
python如何写try语句
2020/07/14 Python
新加坡航空官方网站:Singapore Airlines
2016/10/13 全球购物
jurlique茱莉蔻英国官网:澳洲天然护肤品
2018/08/03 全球购物
Sarenza德国:法国最大的时尚鞋和包包网上商店
2019/06/08 全球购物
Yummie官方网站:塑身衣和衣柜必需品
2019/10/29 全球购物
为什么group by 和order by会使查询变慢
2014/05/16 面试题
公司领导推荐信
2013/11/12 职场文书
法学专业毕业生求职信
2014/06/12 职场文书
个人授权委托书样本
2014/09/13 职场文书
党员批评与自我批评(5篇)
2014/09/23 职场文书
聊聊golang中多个defer的执行顺序
2021/05/08 Golang