一文简单了解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 相关文章推荐
Idea连接MySQL数据库出现中文乱码的问题
Apr 14 MySQL
教你用eclipse连接mysql数据库
Apr 22 MySQL
my.ini优化mysql数据库性能的十个参数(推荐)
May 26 MySQL
MySQL的Query Cache图文详解
Jul 01 MySQL
mysql5.7的安装及Navicate长久免费使用的实现过程
Nov 17 MySQL
解析MySQL索引的作用
Mar 03 MySQL
一条 SQL 语句执行过程
Mar 17 MySQL
MySQL读取JSON转换的方式
Mar 18 MySQL
MySQL提取JSON字段数据实现查询
Apr 22 MySQL
MySQL 语句执行顺序举例解析
Jun 05 MySQL
SQLServer常见数学函数梳理总结
Aug 05 MySQL
MySQL新手入门进阶语句汇总
Sep 23 MySQL
为什么MySQL不建议使用SELECT *
详解MySQL的主键查询为什么这么快
MySQL表锁、行锁、排它锁及共享锁的使用详解
navicat 连接Ubuntu虚拟机的mysql的操作方法
MySQL中IO问题的深入分析与优化
mysql的Buffer Pool存储及原理
一次Mysql update sql不当引起的生产故障记录
You might like
十天学会php之第三天
2006/10/09 PHP
使用php转义输出HTML到JavaScript
2015/03/27 PHP
学习php设计模式 php实现工厂模式(factory)
2015/12/07 PHP
网页前台通过js非法字符过滤代码(骂人的话等等)
2010/05/26 Javascript
JS获得URL超链接的参数值实例代码
2013/06/21 Javascript
图片上传插件jquery.uploadify详解
2013/11/15 Javascript
JavaScript DOM事件(笔记)
2015/04/08 Javascript
jquery实现的代替传统checkbox样式插件
2015/06/19 Javascript
javascript数据结构之串的概念与用法分析
2017/04/12 Javascript
Javascript实现信息滚动效果
2017/05/18 Javascript
vue做网页开场视频的实例代码
2017/10/20 Javascript
Vue单页面应用保证F5强刷不清空数据的解决方案
2018/01/31 Javascript
vue拦截器实现统一token,并兼容IE9验证功能
2018/04/26 Javascript
D3.js实现拓扑图的示例代码
2018/06/30 Javascript
微信小程序新手教程之页面打开数量限制
2019/03/03 Javascript
基于jquery实现彩色投票进度条代码解析
2020/08/26 jQuery
js利用拖放实现添加删除
2020/08/27 Javascript
[01:28:44]DOTA2-DPC中国联赛定级赛 RNG vs iG BO3第一场 1月10日
2021/03/11 DOTA
[03:02]2020完美世界城市挑战赛(秋季赛)总决赛回顾
2021/03/11 DOTA
使用Python实现下载网易云音乐的高清MV
2015/03/16 Python
python通过openpyxl生成Excel文件的方法
2015/05/12 Python
玩转python爬虫之cookie使用方法
2016/02/17 Python
python 接口实现 供第三方调用的例子
2019/08/13 Python
python 解决flask uwsgi 获取不到全局变量的问题
2019/12/22 Python
使用Numpy对特征中的异常值进行替换及条件替换方式
2020/06/08 Python
Python实现手绘图效果实例分享
2020/07/22 Python
open_basedir restriction in effect. 原因与解决方法
2021/03/14 PHP
金牌葡萄酒俱乐部:Gold Medal Wine Club
2017/11/02 全球购物
文秘专业个人求职信
2013/12/22 职场文书
聘任书的写作格式及范文
2014/03/29 职场文书
《锄禾》教学反思
2014/04/08 职场文书
工程主管竞聘书
2015/09/15 职场文书
游戏开发中如何使用CocosCreator进行音效处理
2021/04/14 Javascript
springboot如何初始化执行sql语句
2021/06/22 Java/Android
python常见的占位符总结及用法
2021/07/02 Python
mysql 排序失效
2022/05/20 MySQL