首页
学习
活动
专区
圈层
工具
发布

MySQL冗余和重复索引

MySQL允许在相同列上创建多个索引,无论是有意还是无意,mysql需要单独维护重复的索引,并且优化器在优化查询的时候也需要逐个地进行考虑,这会影响性能。   ...重复索引是指的在相同的列上按照相同的顺序创建的相同类型的索引,应该避免这样创建重复索引,发现以后也应该立即删除。但,在相同的列上创建不同类型的索引来满足不同的查询需求是可以的。...冗余索引和重复索引有一些不同,如果创建了索引(a,b),再创建索引(a)就是冗余索引,因为这只是前面一个索引的前缀索引,因此(a,b)也可以当作(a)来使用,但是(b,a)就不是冗余索引,索引(b)也不是...注:state_id已经有索引了,根据前面的概念,这是一个冗余索引而不是重复索引) 怎么找出冗余索引和重复索引呢?...参考文献:  [1] Baron Schwartz等 著,宁海元等 译 ;《高性能MySQL》(第3版); 电子工业出版社 ,2013 高性能MySQL(第3版) 中文PDF带目录清晰版 下载  http

2K20

「Mysql索引原理(十)」冗余和重复索引

MySQL允许在相同列上创建多个索引,无论是有意的还是无意的。MySQL需要单独维护重复的索引,并且优化器在优化查询的时候也需要逐个进行考虑,这会影响性能。...重复索引 重复索引是指在相同的列上按照相同的的顺序创建相同类型的索引。应该避免这样创建重复索引,发现以后应该立即删除。...工作中不经意间会创建重复索引,如: create table test{ ID INT NOT NULL PRIMARY KEY, A INT NOT NULL,...事实上,MySQL的唯一限制和主键限制都是通过索引实现的。因此,上面的写法实际上在相同的列上创建了三个重复的索引。通常并没有理由这样做,除非是在同一列上创建不同类型的索引来满足不同的查询需求。...冗余索引 概念 冗余索引和重复索引有一些不同。如果创建了索引(A,B),再创建索引(A)就是冗余索引,因为这只是前一个索引的前缀索引。

1.8K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    MySQL不走索引的情况分析

    回表操作可能会增加额外的磁盘访问和数据检索的开销,因此,在某些情况下,当MySQL判断回表所需的资源大于直接扫描全表时,它可能选择不走索引,而是执行全表扫描。...还有一种情况是:在关联查询时,驱动表关联字段两者排序规则不一致时也会导致不走索引。...关于隐式转换更多详细内容可以参考: 浅析 MySQL 的隐式转换 in/not in 条件导致不走索引 in、not in、不走索引的原因是相似的,以下基于in语句分析。...出现这种现象的场景是:当有大量数据在短时间内落库时,Innodb还没更新统计相关信息,此时来了一个查询,MySQL会基于历史数据做出错误的判断:当前表数据量少,不走索引更高效。...请参考: 一招快速解决mysql innodb表索引统计信息不准确问题 - 墨天轮 like语句 like语句无法命中索引的情况: 前导通配符:%value 通配符在字符串的中间:value%value

    1.1K70

    MySQL不走索引的情况分析

    专栏持续更新中:MySQL详解 未建立索引 当数据表没有设计相关索引时,查询会扫描全表。...回表操作可能会增加额外的磁盘访问和数据检索的开销,因此,在某些情况下,当MySQL判断回表所需的资源大于直接扫描全表时,它可能选择不走索引,而是执行全表扫描。...以上SQL等效为: SELECT * FROM products WHERE type in CAST('1' AS tinyint,'2' as tinyint); 由于使用了CAST()函数,会导致不走索引的现象...还有一种情况是:在关联查询时,驱动表关联字段两者排序规则不一致时也会导致不走索引。 in/not in 条件导致不走索引 in、not in、不走索引的原因是相似的,以下基于in语句分析。...出现这种现象的场景是:当有大量数据在短时间内落库时,Innodb还没更新统计相关信息,此时来了一个查询,MySQL会基于历史数据做出错误的判断:当前表数据量少,不走索引更高效。

    1.1K10

    MySQL not exists 真的不走索引么?

    在一些业务场景中,会使用NOT EXISTS语句确保返回数据不存在于特定集合,部分同事会发现NOT EXISTS有些场景性能较差,甚至有些网上谣言说”NOT EXISTS不走索引”,哪对于NOT EXISTS...NOT EXISTS真的不走索引么? 查看两种SQL的执行计划! 使用NOT EXIST方式的执行计划: ? 使用LEFT JOIN方式的执行计划: ?...从执行计划来看,两个表都使用了索引,区别在于NOT EXISTS使用“DEPENDENT SUBQUERY”方式,而LEFT JOIN使用普通表关联的方式。 推荐看下:为什么索引能提高查询速度?...通过MySQL提供的Profiling方式来查看两种方式的执行过程。 使用NOT EXIST方式的执行过程: ? 使用LEFT JOIN方式的执行过程: ?...关注公众号Java技术栈回复m36获取一份MySQL研发军规。 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    3.7K40

    Mysql中哪些Sql不走索引

    要尽量避免这些不走索引的sql: SELECT `sname` FROM `stu` WHERE `age`+10=30;– 不会使用索引,因为所有索引列参与了计算 SELECT `sname` FROM...` LIKE’金蝶%’ — 走索引 SELECT * FROM `houdunwang` WHERE `uname` LIKE “%金蝶%” — 不走索引 — 正则表达式不使用索引,这应该很好理解,所以这就是为什么在...`a`=”1″ — 走索引 EXPLAIN SELECT * FROM `a` WHERE `a`=1 — 不走索引,同样也是使用了函数运算 select * from dept where dname...=’xxx’ or loc=’xx’ or deptno=45 –如果条件中有or,即使其中有条件带索引也不会使用。...换言之,就是要求使用的所有字段,都必须建立索引,我们建议大家尽量避免使用or 关键字 — MySQL内部优化器会对SQL语句进行优化,如果优化器估计使用全表扫描要比使用索引快,则不使用索引

    2K20

    MySQL性能优化 - 快速检查重复和冗余索引

    下面开始今天对于MySQL索引的一些实践 在实际项目中, 往往是由多人协同开发,在项目的更新迭代中难免有时候会由不同的开发人员在同一张表上建立了不同名字但实际上重复列的索引, 之前我们说过每个索引都会占用空间...,并且在插入新数据,更新和删除已有数据的时候都需要维护索引,所以去除掉这些重复的索引很有必要。...最后给出了此次检查的一些summary, 也就是此次总共检查了19个索引,总共有2个重复的索引,并且重复索引占用的空间是56580670字节, 可以用以下命令查看employees表每个索引占的空间 mysql...17,也没有了重复索引。...FULLTEXT索引的列,这种情况下并不是真正的重复,因为是不同的索引结构 --clustered 默认情况下是TRUE, 如果主键索引的列是一个非主键索引的后缀,则认为这两个索引是重复的。

    1.2K00

    MySQL 中 SQL 语句为什么不走索引?

    发表于2019-08-212020-03-03 作者 Ryan 首先, 明确一下在MySQL 中,执行 SQL 语句流程如下(图来自网络): image.png 一条 SQL...下面来讲一下,如何定位 SQL 未走索引的原因 我们大部分情况下,使用的是 Explain 来分析 SQL 语句是否走索引,即便语法分析的时候是走了索引的,执行的时候,还是有可能没有走索引...如果你详细看过 MySQL 官方网站的说明文档,会看到这一章节内容:Chapter 8 Tracing the Optimizer (https://dev.mysql.com/doc/internals...在执行 SQL 的的时候,对 SQL 的执行代价会有个判断,如果走索引的代价,超过不走索引,那它就放弃使用索引,也就是我们执行 SQL 时,所遇到的 explain 分析走索引,真正线上执行没有走索引的原因...= 等非判断,是不走索引的,其实是不严谨的,或者说是错误的,真正的原因与这里说的 “执行代价分析”都是一回事。

    2.1K10

    MySQL的OR条件查询不走索引?可以这样解决

    今天这篇文章我们来简单介绍一下MySQL的OR条件查询,以及它可能会引发的索引失效(即不走索引)的场景以及解决方案。方便大家在实践中,留意是否正确使用了OR条件查询。...: SELECT * FROM orders WHERE status = 'pending' OR status = 'processing'; 其中,在多字段查询的场景下,需要特别留意是否会出现不走索引的情况...不走索引案例分析 如果查询条件中包含 OR 操作符,通常情况下,即使其中一个条件是基于索引的,MySQL 也可能不会使用该索引,转而执行全表扫描(Table Scan)。...,MySQL 使用了 index_merge 查询优化策略,结合主键索引和辅助索引 index_name。...总结规则 第一、一般规则: 查询条件使用 OR 且部分字段没有索引时,MySQL 很可能会选择执行全表扫描,而不是使用索引。 MySQL 的查询优化器在处理 OR 时效率较差。

    16210

    MySQL 普通索引 vs 唯一索引:不只是“能不能重复”这么简单

    其核心特征是: 只参与查询优化器的成本计算 不参与任何数据合法性判断 不承担数据正确性责任 换句话说: **普通索引解决的是“怎么更快读到数据”,而不是“这份数据对不对”**。...: 数据完全合法 是否重复不在其职责范围内 这意味着: 唯一性完全依赖应用逻辑 并发下极易写穿 从 DBA 视角看,这类表的风险是: **数据错误不是“偶发 Bug”,而是“结构性必然”**。...NULL 的语义 在 MySQL 中: UNIQUE 允许多个 NULL 因为 NULL ≠ NULL 这在 DBA 设计阶段非常关键: 如果业务语义是“必须有值且唯一” 必须:UNIQUE...适合普通索引的字段 状态 时间 枚举类型 维度字段 这些字段: 允许重复 不承载业务规则 七、汇总结论 UNIQUE 是数据规则,不是性能工具 INDEX 只负责快,不负责对 不要把数据一致性押在应用代码上...不要重复建索引 PRIMARY KEY、UNIQUE、INDEX 各司其职 一个成熟系统的数据正确性,应该“写死在表结构里”,而不是“祈祷代码不出错”。

    48710

    故障案例:MySQL唯一索引有重复值,官方却说This is not a bug

    问题 原因 故障解决方案 复现步骤 参考文献 一、问题: MySQL5.7.38主从架构,主节点唯一索引上(唯一索引不是主键)有重复值,全部从节点报1062,SQL线程状态异常,根据SQL线程报的binlog...位置点,insert 数据时有重复值,插入失败 二、原因: unique_checks=0时导致,在bug(106121)列表中官方解释的原因:该参数关闭,维护唯一索引时,不会进行物理读,只会进行内存读...三、故障解决方案: 一、临时解决方案 恢复主从: 在从节点开启会话 set sql_log_bin=0 删除表的唯一索引 重新启动复制线程 缺点是:不能够解决数据重复的问题,切换主从后会面临更多重复数据的问题...,如果从节点接收查请求且使用到了原唯一索引的字段,那sql效率会严重下降,但是可以解决主从复制停止的问题 二、永久解决方案 业务自己去重,不要插入重复数据 参数unique_checks保持为1 关于重复的业务数据...重新插入重复唯一索引数据: mysql> set unique_checks=0; mysql> use wl mysql> insert into wl.lgf(id,c,pad) values(

    2.2K20

    mysql 前缀索引_MySQL前缀索引

    前缀索引的选择性 使用前缀索引,在一些场景下可能使得重复的索引值变多,索引的选择性变低,查找时需要过滤更多的行,因此建立前缀索引也要考虑前缀的索引选择性不能太低。...Tips:主键索引和唯一索引的索引值是不可能重复的,索引的选择性就很高,查询效率也最好。 选择足够长的前缀可以更好的保证高选择性,但又不能太长,需要一个合适的长度。怎么选?...Tips:index_column 代表要添加前缀索引的列 在数据增长很快的表中,上述方式计算就不准确了,原因在于数据增长很快的表 index_column 字段重复的记录和总记录数据变化都比较快,那么计算出来的前缀索引长度也是随着变化很快的...MySQL 无法使用前缀索引做 ORDER BY 和 GROUP BY , 也无法使用前缀索引做覆盖扫描。...后缀索引 MySQL 没有提供后缀索引,事实上,一些业务场景对后缀匹配选择性更高,比如我曾经参与过的项目,手机的入网标示imei号,前缀都是86等固定的国家编号开头,这个时候可以将字符反转后存储,就可以建立选择性较高的前缀索引

    7.1K30

    为什么MySQL索引不生效?来看看这8个原因

    确认索引是否被使用 在分析索引未生效的原因之前,首先需要判断 MySQL 是否使用了索引。可以通过 EXPLAIN 命令来查看查询优化器的分析结果,了解哪些索引被考虑,以及最终选择使用了哪个索引。...索引未生效的原因 原因 1:另一个索引更优 当查询可以利用多个索引时,MySQL 优化器会选择其中最优的索引。...原因 4:过时或不准确的统计数据 MySQL 的索引基数统计信息是通过随机采样维护的,可能出现因统计信息过时而导致优化器做出错误决策的情况。...查询条件仅包含 state 时因不满足左前缀无法使用复合索引。 场景 3:连接列类型或字符集不匹配 若连接的字段类型或字符集不一致,索引将无法生效。...原因 8:隐藏索引 MySQL 支持隐藏索引,隐藏索引不会被查询优化器使用。

    13510

    mysql前缀索引使用,Mysql:前缀索引与索引

    可以像普通索引一样使用mysql前缀索引吗?...解决方法: 如果你想一下,MySQL仍会给你正确的答案,即使没有索引…它只是不会那么快……所以,是的,你仍然会得到一个正确的答案前缀索引....前缀索引的排序不超出前缀的长度.如果您的查询使用完整索引来查找行,您通常会发现返回的行是按索引顺序隐式排序的.如果您的应用程序需要这种行为,那么它当然会期待它不应该期望的东西,因为除非您显式ORDER...并且,前缀索引不能用作覆盖索引.覆盖索引是指SELECT中的所有列恰好包含在一个索引中的情况(加上可选的主键,因为它也总是存在).优化器将直接从索引读取数据,而不是使用索引来标识要在主表数据中查找的行....标签:mysql,indexing,innodb 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/142503.html原文链接:https://javaforall.cn

    7.5K20
    领券