一文简单了解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抛出异常的几种常见解决方式
May 18 MySQL
MySQL中出现乱码问题的终极解决宝典
May 26 MySQL
zabbix监控mysql的实例方法
Jun 02 MySQL
Mysql 如何实现多张无关联表查询数据并分页
Jun 05 MySQL
MySQL系列之三 基础篇
Jul 02 MySQL
mysql脏页是什么
Jul 26 MySQL
SQL之各种join小结详细讲解
Aug 04 MySQL
MySQL千万级数据表的优化实战记录
Aug 04 MySQL
浅谈MySql整型索引和字符串索引失效或隐式转换问题
Nov 20 MySQL
WINDOWS 64位 下安装配置mysql8.0.25最详细的教程
Mar 22 MySQL
提高系统的吞吐量解决数据库重复写入问题
Apr 23 MySQL
为什么MySQL不建议使用SELECT *
详解MySQL的主键查询为什么这么快
MySQL表锁、行锁、排它锁及共享锁的使用详解
navicat 连接Ubuntu虚拟机的mysql的操作方法
MySQL中IO问题的深入分析与优化
mysql的Buffer Pool存储及原理
一次Mysql update sql不当引起的生产故障记录
You might like
聊天室php&amp;mysql(六)
2006/10/09 PHP
js Math 对象的方法
2013/09/01 Javascript
Web表单提交之disabled问题js解决方法
2015/01/13 Javascript
Javascript之BOM(window对象)详解
2016/05/25 Javascript
Bootstrap学习系列之使用 Bootstrap Typeahead 组件实现百度下拉效果
2016/07/07 Javascript
Vue.js组件tree实现无限级树形菜单
2016/12/02 Javascript
深入理解JavaScript的值传递和引用传递
2018/10/24 Javascript
玩转Koa之koa-router原理解析
2018/12/29 Javascript
基于vue实现滚动条滚动到指定位置对应位置数字进行tween特效
2019/04/18 Javascript
npm的lock机制解析
2019/06/20 Javascript
[08:04]TI4西雅图DOTA2前线报道 海涛探访各路人马
2014/07/09 DOTA
Python SQLite3数据库操作类分享
2014/06/10 Python
Python检测网站链接是否已存在
2016/04/07 Python
python常用知识梳理(必看篇)
2017/03/23 Python
Python实现简单http服务器
2018/04/12 Python
python 实现UTC时间加减的方法
2018/12/31 Python
Python实现的对本地host127.0.0.1主机进行扫描端口功能示例
2019/02/15 Python
Python利用lxml模块爬取豆瓣读书排行榜的方法与分析
2019/04/15 Python
详解Python中的正斜杠与反斜杠
2019/08/09 Python
python的pyecharts绘制各种图表详细(附代码)
2019/11/11 Python
python求质数列表的例子
2019/11/24 Python
Python文件操作函数用法实例详解
2019/12/24 Python
Win下PyInstaller 安装和使用教程
2019/12/25 Python
Keras 中Leaky ReLU等高级激活函数的用法
2020/07/05 Python
python多线程semaphore实现线程数控制的示例
2020/08/10 Python
CSS3制作圆角图片和椭圆形图片
2016/07/08 HTML / CSS
描述一下JVM加载class文件的原理机制
2013/12/08 面试题
材料采购员岗位职责
2013/12/17 职场文书
求职信模板标准格式范文
2014/02/23 职场文书
班主任与学生安全责任书
2014/07/25 职场文书
要账委托书范本
2014/09/15 职场文书
《我们的民族小学》教学反思
2016/02/19 职场文书
K8s部署发布Golang应用程序的实现方法
2021/07/16 Golang
详解jQuery的核心函数和事件处理
2022/02/18 jQuery
Django基础CBV装饰器和中间件
2022/03/22 Python
centos环境下nginx高可用集群的搭建指南
2022/07/23 Servers