我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL45讲之前缀索引 - flowers

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL45讲之前缀索引 - flowers

MySQL45讲之前缀索引 - flowers

本文介绍字符串的前缀索引优缺点,以及字符串区分度不高情况下,可以考虑如何建立索引。

前言

本文介绍字符串的前缀索引优缺点,以及字符串区分度不高情况下,可以考虑如何建立索引。

前缀索引

对于像SELECT * FROM t WHERE email = "xxxx@163.com"的查询语句,如果不对email列建立索引,那么将会进行全表扫描。

对字符串建立索引,可以对整个字符串建立索引,也可以只对前几个字符建立索引,第二者就是所谓的前缀索引方式。

优点

节省存储空间。如果字符串长度比较长,需要对整个字符串建立索引,那么索引树占用的存储空间时很大的。而如果只是对前一部分字符建立索引,那么可以很好的节省存储空间。

缺点

可能会增加扫描行数,影响查询性能。因为整个字符串可能不相同,但是前缀可能是相同的,导致使用前缀索引时,需要更多的回表扫描行。

所以,建立前缀索引前需要找到区分度最高的前缀。可以通过SELECT COUNT(distinct email(n)) FROM t;计算前缀不同的行数,和表的总行数比较,得到区分度最高的前缀。

索引覆盖失效。比如SELECT id, email FROM t WHERE email = "xxx@163.com",可以使用覆盖索引,但因为索引树只有字符串部分数据,必须回表拿数据,即索引覆盖失效。

字符串区分度不高时

对于只存在字符串的等值查询场景,且整个字符串区分度不高的情况,可以考虑如何建立索引?

存储逆序字符串并建立索引。适用于原始字符串前缀的区分度不高,但字符串末尾区分度高的场景,查询语句为SELECT * FROM t WHERE email = reverse(xxx@163.com)

新建立一列,内容为原始字符串的crc32哈希值,并对哈希值这列建立索引。适用于整个字符串前后部分区分度都不高的场景,查询语句为SELECT * FROM t WHERE crc_col = crc32("xxx@163.com") and email = "xxx@163.com"。因为可能发生哈希冲突,所以需要再比较下字符串值。

注意,前缀索引目的在于节省存储空间,但相应地也增加了开发转换的复杂度和错误的风险。存储资源足够的情况下,建议优先考虑整个字符串索引方式。

参考

  • [1] 讲怎么给字符串字段加索引

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL45讲之前缀索引 - flowers

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL45讲之前缀索引 - flowers

本文介绍字符串的前缀索引优缺点,以及字符串区分度不高情况下,可以考虑如何建立索引。 前言本文介绍字符串的前缀索引优缺点,以及字符串区分度不高情况下,可以考虑如何建立索引。前缀索引对于像SELECT * FROM t WHERE email = "xxxx
MySQL45讲之前缀索引 - flowers
2020-06-03

MySQL45讲之优化器选错索引 - flowers

本文简要介绍优化器选择索引的依据有哪些,有什么办法人为引导优化器选择更优的执行方案。 前言本文简要介绍优化器选择索引的依据有哪些,有什么办法人为引导优化器选择更优的执行方案。为什么会出现选错索引可能是统计索引基数信息错误,导致优化器错选索引,也可能是My
MySQL45讲之优化器选错索引 - flowers
2022-03-28

MySQL45讲之幻读 - flowers

本文介绍什么是幻读,幻读存在的问题和解决方式,以及间隙锁带来的困扰。 前言本文介绍什么是幻读,幻读存在的问题和解决方式,以及间隙锁带来的困扰。什么是幻读什么是幻读,有两个条件:必须是“当前读”情况下才可能发生,“快照读”不会出现只有插入操作才算幻读,更新
MySQL45讲之幻读 - flowers
2018-06-06

MySQL45讲之count操作 - flowers

本文介绍 MyISAM 和 InnoDB 如何执行 count 操作,如果是一个需要使用 count 进行大量计数的场景,应该如何设计实现,以及不同 count 操作的效率。 前言本文介绍 MyISAM 和 InnoDB 如何执行 count 操作,如果
MySQL45讲之count操作 - flowers
2021-05-25

MySQL45讲之函数转换导致不使用索引 - flowers

本文介绍三种因为函数转换导致不使用索引的问题。 前言本文介绍三种因为函数转换导致不使用索引的问题。注意,不使用索引指的是不使用树搜索,而是全表扫描索引树。显式使用函数比如 select count(*) from tradelog where month
MySQL45讲之函数转换导致不使用索引 - flowers
2022-02-20

MySQL45讲之order工作原理 - flowers

本文介绍 order 的三种排序方式,全字段排序、rowid 排序和索引树排序,以及每种排序方式具体是如何工作的。 前言本文介绍 order 的三种排序方式,全字段排序、rowid 排序和索引树排序,以及每种排序方式具体是如何工作的。当使用 explai
MySQL45讲之order工作原理 - flowers
2017-04-04

MySQL45讲之更新缓存 - flowers

本文介绍MySQL的更新缓存Change Buffer,以及唯一索引和普通索引如何选择。 前言本文介绍MySQL的更新缓存Change Buffer,以及唯一索引和普通索引如何选择。唯一索引和普通索引的选择查询过程唯一索引下,查询索引树,找到第一条匹配的
MySQL45讲之更新缓存 - flowers
2018-03-28

MySQL45讲之表空间回收 - flowers

本文介绍为什么删除了一部分表数据后,表文件大小不变,以及有哪些表空间回收的方式。 前言本文介绍为什么删除了一部分表数据后,表文件大小不变,以及有哪些表空间回收的方式。为什么删除表数据后,表文件大小不变MySQL 采用的是标记删除,需要等待后台 purge
MySQL45讲之表空间回收 - flowers
2014-09-02

MySQL45讲之InnoDB加锁规则 - flowers

本文介绍 MySQL InnoDB 的加锁规则,以及分析加锁时,一些需要注意的点。 前言本文介绍 MySQL InnoDB 的加锁规则,以及一些需要注意的点。总结两个原则,两个优化,一个 bug:原则1:加锁的基本单位是 next-key 锁,是一个前开
MySQL45讲之InnoDB加锁规则 - flowers
2018-08-28

MySQL45讲之IO性能提升 - flowers

本文介绍 MySQL 的 binlog 和 redo log 写入机制和刷盘策略,以及如何提升 MySQL 的 IO 性能。 前言本文介绍 MySQL 的 binlog 和 redo log 写入机制和刷盘策略,以及如何提升 MySQL 的 IO 性能。
MySQL45讲之IO性能提升 - flowers
2015-04-27

MySQL45讲之用户关注案例 - flowers

本文介绍 MySQL45 讲中提到的一个用户关注的案例,并记录下可行的处理方案。 前言本文介绍 MySQL45 讲中提到的一个用户关注的案例,并记录下可行的处理方案。业务背景业务上有这样的需求,A、B两个用户,如果互相关注,则成为好友。存在两个表,关系(
MySQL45讲之用户关注案例 - flowers
2016-04-14

MySQL45讲之InnoDB刷脏策略 - flowers

本文介绍 InnoDB 的刷脏控制策略,它是如何控制刷脏速率的,以及一些相关参数。 前言本文介绍 InnoDB 的刷脏控制策略,它是如何控制刷脏速率的,以及一些相关参数。意义了解 MySQL 的刷脏策略有什么意义?当一条正确的 SQL 执行时偶尔延迟较高
MySQL45讲之InnoDB刷脏策略 - flowers
2018-05-10

MySQL45讲之保证高可用 - flowers

本文主要介绍 MySQL 主备延迟,延迟产生的原因和主备切换策略。 前言本文主要介绍 MySQL 主备延迟,延迟产生的原因和主备切换策略。主备延迟主备同步过程中时间点主要有三个:主库A执行完成一个事务,写入binlog,我们把这个时刻记为T1;之后传给备
MySQL45讲之保证高可用 - flowers
2017-08-07

MySQL45讲之查询慢或者阻塞 - flowers

本文介绍锁表和执行慢的例子,以及发生锁表时的排查方法。 前言本文介绍锁表和执行慢的例子,以及发生锁表时的排查方法。锁表1. 等MDL锁比如像 select * from t where id=1; 长时间不返回,可能是因为等 MDL 锁而阻塞。排查方法:
MySQL45讲之查询慢或者阻塞 - flowers
2014-12-08

MySQL45讲之主备数据一致性 - flowers

本文主要介绍 MySQL 主备数据同步的重要日志 binlog 的三种格式,和双 M 结构的循环复制问题。 前言本文主要介绍 MySQL 主备数据同步的重要日志 binlog 的三种格式,和双 M 结构的循环复制问题。binlog三种格式1. state
MySQL45讲之主备数据一致性 - flowers
2019-06-13

MySQL45讲之随机查询和临时表 - flowers

本文介绍 MySQL 随机查询的工作流程、优化随机查询的方式、和临时表。 前言本文介绍 MySQL 随机查询的工作流程、优化随机查询的方式、和临时表。工作流程根据下表结构建立 words 表,并通过过程插入 10000 条模拟数据。CREATE TABL
MySQL45讲之随机查询和临时表 - flowers
2021-03-30

MySQL45讲之备库并行复制策略 - flowers

本文主要介绍 MySQL 备库的并行复制策略。 前言本文主要介绍 MySQL 备库的并行复制策略。为什么备库需要并行复制如果主库有大量更新操作,因为主库可以并发写入,而备库只能单线程执行的话,那么备库的同步延迟会不断累加,即备库越来越追不上主库。所以,后
MySQL45讲之备库并行复制策略 - flowers
2020-10-10

MySQL 前缀索引

索引前缀使用 字符串列的索引规范中的语法,您可以创建仅使用列首字符的索引 。以这种方式仅索引列值的前缀可以使索引文件小得多。为a 或 column 编制索引时 , 必须为索引指定前缀长度。例如: col_name(N)NBLOBTEXTCREATE TABLE
MySQL 前缀索引
2019-05-10

MySQL45讲之生产环境下的性能问题 - flowers

本文介绍一些常见的性能问题,以及在生产环境下应该如何解决。 前言本文介绍一些常见的性能问题,以及在生产环境下应该如何解决。1. 短连接风暴当由于大量短连接造成数据库性能低时,首先考虑一些无损安全的解决方案,如果是必须立刻提升一些数据库性能,那么可以考虑下
MySQL45讲之生产环境下的性能问题 - flowers
2017-08-20

MySQL前缀索引

有时候需要索引很长的字符字段列,这会增加索引的存储空间以及降低索引的查询效率,一种策略是可以使用哈希索引,还有一种就是使用前缀索引。前缀索引是选择字符列的前n个字符作为索引,这样可以大大节约索引空间,从而提高索引效率。前缀索引的选择性使用前缀索引,在一些场景下
MySQL前缀索引
2016-07-14

编程热搜

目录