首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

聊聊索引失效的10种场景,太坑了

看到这里,不知道聪明的你,有没有发现这样一个规律:这4条sql中都有code字段,它是索引字段中的第一个字段,也就是最左边的字段。只要有这个字段在,该sql已经就能走索引。...索引列用了函数 有时候我们在某条sql语句的查询条件中,需要使用函数,比如:截取某个字段的长度。...请大家注意观察一下t_user表中的code字段,它是varchar字符类型的。...列对比 上面的内容都是常规需求,接下来,来点不一样的。 假如我们现在有这样一个需求:过滤出表中某两列值相同的记录。比如user表中id字段和height字段,查询出这两个字段中值相同的记录。...你可能一脸懵逼,为什么?我做了什么? 答:因为你最后加的address字段没有加索引,从而导致其他字段的索引都失效了。

1.4K50

MySQL数据库索引失效的10种场景你知道吗?

博主猫头虎的技术世界 欢迎来到猫头虎的博客 — 探索技术的无限可能! 前言 不知道你在实际工作中,有没有遇到过下面的这两种情况: 明明在某个字段上加了索引,但实际上并没有生效。...准备工作 所谓空口无凭,如果我直接把索引失效的这些场景丢出来,可能没有任何说服力。 所以,我决定建表和造数据,给大家一步步演示效果,尽量做到有理有据。...看到这里,不知道聪明的你,有没有发现这样一个规律:这4条sql中都有code字段,它是索引字段中的第一个字段,也就是最左边的字段。只要有这个字段在,该sql已经就能走索引。...索引列用了函数 有时候我们在某条sql语句的查询条件中,需要使用函数,比如:截取某个字段的长度。...请大家注意观察一下t_user表中的code字段,它是varchar字符类型的。

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

    面试官:聊聊索引失效的10种场景,能回答一半就算过

    准备工作 所谓空口无凭,如果我直接把索引失效的这些场景丢出来,可能没有任何说服力。 所以,我决定建表和造数据,给大家一步步演示效果,尽量做到有理有据。...看到这里,不知道聪明的你,有没有发现这样一个规律:****这4条sql中都有code字段,它是索引字段中的第一个字段,也就是最左边的字段。只要有这个字段在,该sql已经就能走索引。...索引列用了函数 有时候我们在某条sql语句的查询条件中,需要使用函数,比如:截取某个字段的长度。...请大家注意观察一下t_user表中的code字段,它是varchar字符类型的。...你可能一脸懵逼,为什么?我做了什么? 答:因为你最后加的address字段没有加索引,从而导致其他字段的索引都失效了。

    87420

    面试官:不会sql优化?出门右转顺便带上门,谢谢!

    我在之前的多次面试中最常遇到的一个问题的sql优化,不论是大厂还是小厂。...但我之前没有详细去了解过这些东西啊,我就瞎鸡儿吹了,毕竟我也干过两三年的crud,sql还是写过不少的,也遇到过一些特别长的sql,执行时间特别长的sql,所以以前经常牺牲午睡时间给客户出报表还是有点效果的...索引中使用的字节数,可通过该列计算查询中使用的索引长度 ref 显示索引的哪一列被使用了 rows 估算找到所需数据需读取的行数 filtered 查询的表行占表的百分比 extra 包含不适合在其他列展示但异常重要的信息...(1)system 表中只有一行数据(系统表) (2)const 通过索引一次就能找到的数据,比如primary key 和union key,主键在where条件中,就能将查询转换成一个常量。...(5)possible_keys 可能会使用到的key (6)key 实际使用到的key (7)key_len 索引中使用的字节数,可通过该列计算出使用的是哪些列,长度越短越好。

    84520

    SQL优化指南

    列表中的查询     derived 派生表 该临时表是从子查询派生出来的     等等 type:表示MySQL在表中查找数据的方式,或者叫访问类型,以下对于type取值的说明 从上往下性能由最差到最好...不过它是有前提条件的,条件是没有任何where条件的count(*)才非常快,因为此时无须实际的去计算表的行数,mysql可以利用存储引擎的特性直接获得这个值,如果mysql知道某列不可能有null值,...当统计带有where条件的查询,那么mysql的count()和其他存储引擎就没有什么不同了。...如果删除主键,他们都走全表扫描。   2.如果count(列)中的字段是索引的话,count(列)和count(*)一样快,否则count(列)走全表扫描。...第一种思路 在索引上分页   在索引上完成分页操作,最后根据主键关联回原表查询所需要的其他列的内容。

    80020

    SQL优化指南

    ,也就是位于select列表中的查询 derived 派生表 该临时表是从子查询派生出来的 等等 type:表示MySQL在表中查找数据的方式,或者叫访问类型,以下对于type...不过它是有前提条件的,条件是没有任何where条件的count(*)才非常快,因为此时无须实际的去计算表的行数,mysql可以利用存储引擎的特性直接获得这个值,如果mysql知道某列不可能有null值,...当统计带有where条件的查询,那么mysql的count( )和其他存储引擎就没有什么不同了。...如果删除主键,他们都走全表扫描。 如果count(列)中的字段是索引的话,count(列)和count(*)一样快,否则count(列)走全表扫描。...第一种思路 在索引上分页 在索引上完成分页操作,最后根据主键关联回原表查询所需要的其他列的内容。

    85320

    曾经,我以为我很懂MySQL索引

    在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。...当表中有大量记录时,若要对表进行查询,第一种搜索信息方式是全表搜索,是将所有记录一一取出,和查询条件进行一一对比,然后返回满足条件的记录,这样做会消耗大量数据库系统时间,并造成大量磁盘I/O操作;第二种就是在表中建立索引...,然后在索引中找到符合查询条件的索引值,最后通过保存在索引中的ROWID(相当于页码)快速找到表中对应的记录。   ...因此,在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边。...虽然我们山东人基本不吃米饭,但我还是羞愧不已。。   然后经理通过调用一个dateTime函数分组查询处理一下,就ok了,效率是我的几十倍吧。

    79821

    MySQL 查询专题

    也可能会使用完全限定的名字来引用列。 WHERE 过滤数据 MySQL中可根据需要使用很多条件操作符和操作符的组合。为了检查某个范围的值,可使用BETWEEN操作符。 注意:是!=还是?!...下标从 0 开始,当根据不出现在 SELECT 清单中的列进行排序时,不能采用这项技术 如果想在多个列上进行降序排序,必须对每一列指定 DESC 关键字。...在升序排序时可以指定它。但实际上,指定 ASC 没有多大用处 在对文本性数据进行排序时,A 与a 相同吗?a位于 B 之前,还是Z之后?这些问题不是理论问题,其答案取决于数据库的设置方式。...表名2 别名2 where 条件) 单行多列 select * from 表1 别名1 where (列1, 列2) in (select 列1, 列2 from 表2 别名2 where 条件)...很少见, 看上去像对象 多行多列 select * from 表1 别名1 , (select ... ) 别名2 where 条件 所谓的连接是有针对性的找出关联关系 全文搜索 用基于文本的搜索作为正则表达式匹配列值的更进一步的介绍

    5K30

    还有这些MySQL高性能索引优化策略等你试用

    但我要讲的是另外一个原因:使用select*,就基本不可能再使用到覆盖索引(什么是覆盖索引,后面会讲),反而是将一个本该可以用覆盖索引的查询变成了不能使用覆盖索引的查询,就会导致随机I/O或回表查询(回表查询在下文介绍聚簇索引的时候会讲...当然如果查询满足以上条件,那也就可以用这些列进行排序。 2、哈希索引 哈希索引是基于哈希表实现的,只支持精确索引查询。在MySQL中,目前只有Memory引擎支持哈希索引,但我们可以自定义哈希索引。...具体思路是这样的: 在表中创建一列用来存储哈希值,然后还是用B-TREE索引进行查找。...这么用的话,需要一点,在IN()条件中,优化器需要做的组合是以指数增加的。...在没有ICP的时候,WHERE条件中没有被索引用到的列的过滤是在MySQL服务层中;而有了ICP之后,这种过滤就直接在储存引擎层中完成了,而且是在二级索引回表查询前就完成了过滤,这就避免了大量的数据传输

    71220

    MySQL SQL语句是如果被执行的?(1)原

    实际上还是在解析的时候报错,解析SQL的环节里面有个预处理器。 它会检查生成的解析树,解决解析器无法解析的语义。比如,它会检查表和列名是否存在,检查名字和别名,保证没有歧义。...,使用一个索引来选择行 ref 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值 eq_ref 类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,...要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。...filesort 当Query中包含 order by 操作,而且无法利用索引完成的排序操作称为“文件排序” Using join buffer 该值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果...Impossible where 这个值强调了where语句会导致没有符合条件的行(通过收集统计信息不可能存在结果) Select tables optimized away 这个值意味着仅通过使用索引

    1.1K20

    神奇的 SQL 之 MySQL 性能分析神器 → EXPLAIN,SQL 起飞的基石!

    我又惊又喜,脑中闪过我所认识的可能联系我的女性,得出个结论:她们这会不可能联系我呀,图像也没映象,到底是谁了?...找到对应的查询 SQL ,就是两个表的联表查询,连接键也有索引,WHERE 条件也能走索引,怎么会慢了?...SIMPLLE、PRIMARY、SUBQUERY、DERIVED 这 4 个在实际工作中碰到的会比较多,看得懂这 4 个就行了,至于其他的,碰到了再去查资料就好了(我也想全部记住,但用的少,太容易忘记了...若为空则表示没有可以使用的索引,此时可以通过检查 WHERE 语句看是否可以引用某些列或者新建索引来提高性能   key     展示这个 SQL 实际使用的索引,如果没有选择索引,则此列为null,要想强制...MySQL 使用或忽视 possible_keys 列中的索引,在查询中使用 FORCE INDEX、USE INDEX 或者I GNORE INDEX   key_len     展示 MySQL

    59130

    原 荐 MySQL-性能优化-索引和查询优化

    但由于内存容量的限制,也不可能将所有的数据都放内存中。 ? MySQL索引分类 普通索引:最基本的索引,没有任何限制。...复杂SQL语句优化的思路: 1)首先考虑在一个表中能不能取到有关的信息,尽量少关联表 2)关联条件争取都走主键或外键查询条件,能走到对应的索引 3)争取在满足业务上走小集合数据查找 4)INNER...0,确保表中num列没有null值,然后这样查询:select id from t where num=0 3)应尽量避免在 where 子句中使用!...4)应尽量避免在 where 子句中使用or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num=10 or num=20可以这样查询:select...11)在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。

    76140

    MySQL执行计划

    const用于比较primary key或者union索引,比如where条件后面跟的是主键,那就是const。 eq_ref 唯一索引扫描,对于每个索引键,表中只有一条记录匹配。...比如员工表tb_emp有一个字段deptId,表示部门的id,与部门表tb_dept的主键id建立了外键索引,并且tb_emp表中的每一条记录的deptId,在tb_dept表中只能找到一条记录,这种情况就是...range 表示用索引在某一个范围搜索,用between或者in,比如,explain select * from tb_emp where id between 1 and 4; index 全索引扫描...复合索引 key_len:表示索引中使用的字节数,可以通过这个知道查询中使用的索引长度,这个长度是最大的可能长度,而不是实际长度。长度越短越好。...ref rows:根据表统计信息及索引使用情况,大致估算出找到所需记录需要读取的行数。 fltered:按表条件过滤的行百分比 extra:包含了一些十分重要但又不适合在其他列显示的信息。

    1.1K20

    《深入浅出SQL》问答录

    A:如果想在AND或OR子句中使用NOT,请直接将它放在关键字后面,如下: SELECT * FROM asd WHERE NOT main = ‘aaa’ AND NOT mian = ‘bbb’;...A:外键为NULL,表示在父表中没有相符的主键。但我们可以确认外键包含有意义、已经存储在父表中的值,请通过约束实现。 不能单纯的使用另一张表的键,称之为外键,而不加上约束吗?...据说使用子查询能解决的事情,用联接也可以?是这样吗? A:不然呢? ---- 左外联接 LEFT OUTER JOIN 会匹配左表中的每一行及右表中符合条件的行。...当左表与右表具有一对多关系时,左外联接特别有用。 理解外联接的最大秘密在于知道表在左边还是右边,在LEFT OUTER JOIN中,出现在FROM后,联接前的表称为左表,而出现在联接后的表称为右表。...右外联接 有外联接与左外联接一样,除了它是用右表与左表比对。 自联接 同一个表可以同时作为外联接的左右表。虽然听起来很奇怪,不过却很好用。 来一题看看; ?

    2.9K50

    SQL查询提速秘诀,避免锁死数据库的数据库代码

    解决办法:在 SQL 查询中使用内联 CASE 语句,这检验每一行的订单金额条件,并向表写入“Preferred”标记之前,设置该标记,这样处理性能提升幅度很惊人。...这通常表现为 WHERE 子句中的一个额外外连接或额外条件。如果你根据自己的确切要求精简重用的代码,就能大幅提升性能。 需要几列,就提取几列 这个问题类似第 2 个问题,但这是列所特有的。...最后我要说,你根本不需要使用游标,总是会有一种基于集合的解决方法。 使用表值函数 这是一直以来我最爱用的技巧之一,因为它是只有专家才知道的那种秘诀。...几年前我做过一项基准测试,我将一堆数据插入到一个带聚类 GUID 的表中,将同样的数据插入到另一个带 IDENTITY 列的表中。...所以,最后的查询是: SELECT rows from sysindexes where object_name(id)='T1'and indexid =1 在我 2.7 亿行的表中,不到 1 秒就返回结果

    1.6K30

    高效sql性能优化极简教程

    完全外连接包含full join左右两表中所有的行,如果右表中某行在左表中没有匹配,则结果中对应行右表的部分全部为空(NULL),如果左表中某行在右表中没有匹配,则结果中对应行左表的部分全部为空(NULL...3,避免使用* 当你想在select子句中列出所有的列时,使用动态sql列引用“*”是一个方便的方法,不幸的是,是一种非常低效的方法。...4,用where子句替换having子句 where子句搜索条件在进行分组操作之前应用;而having自己条件在进行分组操作之后应用。...11,避免对列的操作 不要在where条件中对字段进行数学表达式运算,任何对列的操作都可能导致全表扫描,这里所谓的操作,包括数据库函数,计算表达式等等,查询时要尽可能将操作移到等式的右边,甚至去掉函数。...update serviceinfo set state=0 where state =1 or state =2 14,避免在索引列上使用IS NULL或者NOT 避免在索引中使用任何可以为空的列,导致无法使用索引

    3.3K50

    【MySQL】MySQL Explain性能调优详解

    eq_ref: 类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者 unique key作为关联条件 const、...这意味着在possible_keys中的某些键实际上不能按生成的表次序使用。 如果该列是NULL,则没有相关的索引。...如果是这样,创造一个适当的索引并且再次用EXPLAIN检查查询 六、Key key列显示MySQL实际决定使用的键(索引),必然包含在possible_keys中 如果没有选择索引,键是NULL。...要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。...如果出现了这个值,那应该注意,根据查询的具体情况可能需要添加索引来改进能。 Impossible where:这个值强调了where语句会导致没有符合条件的行(通过收集统计信息不可能存在结果)。

    22710

    Oracle初级性能优化总结

    t1,Table_Name2 3、用Exists 替代 in 在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接。...Table_Name2 t2 on t1.id=t2.id where t2.name='A' 6、用exists替换distinct 当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在...8、用UNION替换OR 通常情况下,用UNION替换where字句中的OR将会起到较好的效果。对索引列使用OR将造成全表扫描。注意,以上规则只针对多个索引列有效。...查询效率可能会因为没有选择OR而降低。...from Table_Name2 t2 where t2.id>=10 前提还是id列是索引列 总结    本节暂时总结到这里,之后继续进行总结,感觉还是很有用的,然后在日常的工作中加以实践,应该对自己的能力有所改善

    89030
    领券