一文简单了解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 相关文章推荐
left join、inner join、right join的区别
Apr 05 MySQL
数据库连接池
Apr 06 MySQL
如何使用Maxwell实时同步mysql数据
Apr 08 MySQL
MySQL数字类型自增的坑
May 07 MySQL
python中的mysql数据库LIKE操作符详解
Jul 01 MySQL
MySQL系列之二 多实例配置
Jul 02 MySQL
浅谈redis的过期时间设置和过期删除机制
Mar 18 MySQL
简单聊一聊SQL注入及防止SQL注入
Mar 23 MySQL
在MySQL中你成功的避开了所有索引
Apr 20 MySQL
MYSQL中文乱码问题的解决方案
Jun 14 MySQL
SQL语句中EXISTS的详细用法大全
Jun 25 MySQL
MySQL的表级锁,行级锁,排它锁和共享锁
Jul 15 MySQL
为什么MySQL不建议使用SELECT *
详解MySQL的主键查询为什么这么快
MySQL表锁、行锁、排它锁及共享锁的使用详解
navicat 连接Ubuntu虚拟机的mysql的操作方法
MySQL中IO问题的深入分析与优化
mysql的Buffer Pool存储及原理
一次Mysql update sql不当引起的生产故障记录
You might like
与数据库连接
2006/10/09 PHP
PHP中SQL查询语句的id=%d解释(推荐)
2016/12/10 PHP
ThinkPHP5.0框架控制器继承基类和自定义类示例
2018/05/25 PHP
JavaScript 对象链式操作测试代码
2010/04/25 Javascript
js实现div的切换特效上一个下一个
2014/02/11 Javascript
全系IE支持Bootstrap的解决方法
2015/10/19 Javascript
简单介绍JavaScript数据类型之隐式类型转换
2015/12/28 Javascript
浅谈js中对象的使用
2016/08/11 Javascript
简单几步实现返回顶部效果
2016/12/05 Javascript
详解vue-cli开发环境跨域问题解决方案
2017/06/06 Javascript
Vue 多层组件嵌套二种实现方式(测试实例)
2017/09/08 Javascript
利用JS动态生成隔行换色HTML表格的两种方法
2018/10/09 Javascript
微信小程序rich-text富文本用法实例分析
2019/05/20 Javascript
JavaScript中的类型检查
2020/02/03 Javascript
node.js中path路径模块的使用方法实例分析
2020/02/13 Javascript
详解vue高级特性
2020/06/09 Javascript
Vue $attrs &amp; inheritAttr实现button禁用效果案例
2020/12/07 Vue.js
[46:12]完美世界DOTA2联赛循环赛 DM vs Matador BO2第一场 11.04
2020/11/04 DOTA
[01:18]PWL开团时刻DAY4——圣剑与抢盾
2020/11/03 DOTA
Python程序员开发中常犯的10个错误
2014/07/07 Python
Python中的异常处理相关语句基础学习笔记
2016/07/11 Python
windows下cx_Freeze生成Python可执行程序的详细步骤
2018/10/09 Python
详解python做UI界面的方法
2019/02/27 Python
python3:excel操作之读取数据并返回字典 + 写入的案例
2020/09/01 Python
使用layui实现左侧菜单栏及动态操作tab项的方法
2020/11/10 HTML / CSS
Expedia挪威官网:酒店、机票和租车
2018/03/03 全球购物
澳大利亚在线家具店:Luxo Living
2019/03/24 全球购物
保安部任务及岗位职责
2014/02/25 职场文书
让生命充满爱演讲稿
2014/05/10 职场文书
企业员工薪酬方案
2014/06/04 职场文书
2014年小学德育工作总结
2014/12/05 职场文书
作文批改评语
2014/12/25 职场文书
2015婚礼主持词开场白
2015/05/28 职场文书
2019银行竞聘书
2019/06/21 职场文书
吃通javascript正则表达式
2021/04/21 Javascript
JavaScript实现淘宝商品图切换效果
2021/04/29 Javascript