一文简单了解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增加索引不生效的几种情况
Jun 23 MySQL
MySQL系列之十五 MySQL常用配置和性能压力测试
Jul 02 MySQL
SQL实现LeetCode(177.第N高薪水)
Aug 04 MySQL
浅谈MySQL表空间回收的正确姿势
Oct 05 MySQL
mysql事务隔离级别详情
Oct 24 MySQL
mysql分表之后如何平滑上线详解
Nov 01 MySQL
全面盘点MySQL中的那些重要日志文件
Nov 27 MySQL
面试提问mysql一张表到底能存多少数据
Mar 13 MySQL
MySQL优化之慢日志查询
Jun 10 MySQL
mysql sql常用语句大全
Jun 21 MySQL
详解MySQL的内连接和外连接
May 08 MySQL
为什么MySQL不建议使用SELECT *
详解MySQL的主键查询为什么这么快
MySQL表锁、行锁、排它锁及共享锁的使用详解
navicat 连接Ubuntu虚拟机的mysql的操作方法
MySQL中IO问题的深入分析与优化
mysql的Buffer Pool存储及原理
一次Mysql update sql不当引起的生产故障记录
You might like
PHP 文件扩展名 获取函数
2009/06/03 PHP
php多个字符串替换成同一个的解决方法
2013/06/18 PHP
PHP调用.NET的WebService 简单实例
2015/03/27 PHP
PHP文件操作之获取目录下文件与计算相对路径的方法
2016/01/08 PHP
Yii2 rbac权限控制之rule教程详解
2016/06/23 PHP
PHP以json或xml格式返回请求数据的方法
2018/05/31 PHP
javascript知识点收藏
2007/02/22 Javascript
基于jquery的滚动新闻列表
2010/06/19 Javascript
firefox火狐浏览器与与ie兼容的2个问题总结
2010/07/20 Javascript
Jquery 表格合并的问题分享
2011/09/17 Javascript
广泛收集的jQuery拖放插件集合
2012/04/09 Javascript
Javascript的各种节点操作实例演示代码
2012/06/27 Javascript
jQuery判断数组是否包含了指定的元素
2015/03/10 Javascript
JS实现控制表格行文本对齐的方法
2015/03/30 Javascript
javascript实现简单加载随机色方块
2015/12/25 Javascript
AngularJS仿苹果滑屏删除控件
2016/01/18 Javascript
微信小程序图片宽100%显示并且不变形
2017/06/21 Javascript
javascript兼容性(实例讲解)
2017/08/15 Javascript
微信小程序HTTP请求从0到1封装
2019/09/09 Javascript
简单了解JavaScript弹窗实现代码
2020/05/07 Javascript
jQuery实现视频展示效果
2020/05/30 jQuery
python Crypto模块的安装与使用方法
2017/12/21 Python
python 3.7.0 安装配置方法图文教程
2018/08/27 Python
Python常用模块之requests模块用法分析
2019/05/15 Python
利用python实现短信和电话提醒功能的例子
2019/08/08 Python
python 监测内存和cpu的使用率实例
2019/11/28 Python
Python读取YAML文件过程详解
2019/12/30 Python
python同义词替换的实现(jieba分词)
2020/01/21 Python
实例讲解Python 迭代器与生成器
2020/07/08 Python
深入浅析pycharm中 Make available to all projects的含义
2020/09/15 Python
HTML5 文件上传下载的实例代码
2017/07/03 HTML / CSS
小学生一分钟演讲稿
2014/08/26 职场文书
大学生党校培训心得体会
2014/09/11 职场文书
深入探讨opencv图像矫正算法实战
2021/05/21 Python
python非标准时间的转换
2021/07/25 Python
Zabbix6通过ODBC方式监控Oracle 19C的详细过程
2022/09/23 Servers