深入浅出MYSQL查询索引失效

mysql索引原理

B+树

索引优缺点

优点

  • 大大减少了服务器需要扫描的数据量
  • 可以帮助服务器避免排序或减少使用临时表排序
  • 索引可以随机I/O变为顺序I/O

缺点

  • 需要占用磁盘空间,因此冗余低效的索引将占用大量的磁盘空间
  • 降低DML性能,对于数据的任意增删改都需要调整对应的索引,甚至出现索引分裂
  • 索引会产生相应的碎片,产生维护开销

索引失效场景

  1. 字符串型字段,比较时用了整形

  2. like的通配符在前

  3. 查询条件中使用了or,但是没有把or中所有字段加上索引

  4. 对索引列进行函数运算

  5. 联合索引abc问题
    Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。
    例如索引是index (a,b,c),可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c或c进行查找
    最左原则是指:mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式,所以这两条都是会命中索引的。要记住和顺序是无关的。

  6. 使用i查询时,in查询条件超过数据库表的一半

  7. where条件中使用NOT IN

  8. where 语句中使用 is null 或者 is not null,当查询量达到总表的30%以上时

  9. 如果排序使用了索引,而select列未使用索引列,则该索引失效
    这是因为优化器执行直接执行全表扫描速度更快。主键索引除外,任何一张表都有一个唯一索引primary,索引列为主键列。

对创建索引的一些技巧总结

  1. 首先数据量小的表不需要建立索引
    因为数据量小的表即使建立索引也不会有大的用处,还会增加额外的索引开销 。

  2. 不经常引用的列不要建立索引,因为不常用,即使建立了索引也没有多大意义

  3. **经常频繁更新的列不要建立索引,因为肯定会影响插入或更新的效率 **

  4. 尽量避免在 where 子句中使用 != 或者 <> 操作符,查询引用会放弃索引而进行全表扫描

  5. 数据类型越小越简单的索引更好
    越小越简单的数据类型通常在磁盘、内存和cpu缓存中需要的空间更少,处理起来更快。

  6. 字段内容尽量避免NULL
    在组合索引中某一索引列有null值,则索引失效。这句话其实是不对的,在单列索引中索引列有null值不会失效。在组合索引中索引列有null值也是可以使用组合索引的,MySQL难以优化引用了可空列的查询,它会使索引、索引统计和值更加复杂。可空列需要更多的储存空间,还需要在MySQL内部进行特殊处理。当可空列被索引的时候,每条记录都需要一个额外的字节,还可能导致 MyISAM 中固定大小的索引(例如一个整数列上的索引)变成可变大小的索引,所以尽量避免null值。
    SQL中,含有空值的列很难进行查询优化,因为它们使得索引、索引的统计信息以及比较运算更加复杂。可以采用0、一个特殊的值或者一个空串代替空值 。

  7. 有大量重复的列不要创建索引
    mysql查询结果要小于30%才会使用索引,不然会使用全表扫描。mysql优化器认为全表扫描的成本小于索引,所以放弃索引,这是很多情况下没使用索引的原因。具有唯一性或者重复性很少的列建立索引会非常有效。

  8. 减少索引长度

    设置索引时可能的话应该指定一个前缀长度。例如,如果有一个CHAR(255)的 列,如果在前10 个或20 个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。

在实际应用的过程中,mysql并不总会选择合理的索引进行查询,此时便可以使用force index(index name)来强制告诉mysql选择哪一个索引。使用一下sql查询:

select * from t_test3 force INDEX (t_test_name) where name in ('a','b');

其对应的执行计划与上图的执行计划相同,采用的是sql中指定的索引。
因此我们在一些情况下首先可以适当的使用force index(indexname) 强制告诉mysql使用什么索引。force index( index name )指令可以指定本次查询使用哪个索引!一条sql只会用到一个索引,mysql优化器会计算出一个合适的索引,但是这个索引不一定是最好的。force index()指令可以避免MySql优化器用到了一个低效的索引,并可以提高sql的执行效率。

终极优化思路:干掉join,优化业务逻辑

参考:mysql的索引及索引误区详解

深入浅出MYSQL查询索引失效相关推荐

  1. 面对 MySQL 查询索引失效,程序员的六大优化技巧!

    作者 | 曹建 责编 | 屠敏 出品 | CSDN(ID:CSDNnews) 我们都知道创建索引的目的是快速从整体集合中选择性地读取满足条件的一部分集合.MySQL中一张表是可以支持多个索引的.但是, ...

  2. mysql 子查询索引失效_mysql 索引失效的情况

    索引失效的几种情况 1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因) 要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引 2.对于多列索引,不是使用 ...

  3. 范围查找(比如日期范围)下查询出现全表扫描MySQL数据库索引失效

    范围查找(比如日期范围)下查询出现全表扫描MySQL数据库索引失效 当下MySQL数据库在多款数据库中脱颖而出,成为使用最广泛的数据库之一,这里我们来看看数据库索引上的一个问题.我们知道在数据量上去以 ...

  4. mysql in 索引 失效_in 索引失效的问题

    简单的in查询 索引失效: 步骤 1.检查建立索引没有 order_status 字段为普通索引的tinyint类型 2.检查是否使用了使索引失效的语句 3.explain查看执行计划 而 in(1) ...

  5. mysql模糊查询索引失效_MySql学习笔记(九):索引失效

    数据准备:CREATE TABLE `t_blog` ( `id` int(11) NOT NULL auto_increment, `title` varchar(50) default NULL, ...

  6. mysql数据索引失效_MySQL索引失效的几种情况

    1.索引无法存储null值 a.单列索引无法储null值,复合索引无法储全为null的值. b.查询时,采用is null条件时,不能利用到索引,只能全表扫描. 为什么索引列无法存储Null值? a. ...

  7. mysql group 索引失效_介绍mysql索引失效的情况

    mysql视频教程栏目索引失效的情况. 索引对于MySQL而言,是非常重要的篇章.索引知识点也巨多,要想掌握透彻,需要逐个知识点一一击破,今天来先来聊聊哪些情况下会导致索引失效. 图片总结版 相关免费 ...

  8. mysql使索引失效语句_mysql语句中索引可能失效的情况

    一.创建两张表 表a 表b  选择不同的存储引擎以InnoDB和MyISAM为例 表a CREATE TABLE `a` ( `ID` int NOT NULL AUTO_INCREMENT , `n ...

  9. MySql复合索引失效的几种情况

    建表 插入数据 建立复合索引 或者 查询插入的索引 执行测试Sql 测试数据1 这里常规查询,分别查询了当使用复合索引中的部分字段当查询条件时的索引使用情况,通过explain执行计划结果显示,以上四 ...

  10. Mysql中索引失效得原因和解决

    文章目录 前言 1.单个字段测试 varchar字段测试 name字段 name and status 测试 name and status and address 测试 2.最左前缀法则 复合索引测 ...

最新文章

  1. Selenium常用API的使用java语言之7-控制浏览器操作
  2. Linux json格式化输出
  3. HttpClient, 使用C#操作Web
  4. html5 接收蓝牙广播_蓝牙定位技术浅析(化工厂应用)
  5. css垂直居中那点事
  6. linux查用户的家目录,详解Linux误删用户家目录的恢复方法
  7. linux 修改网卡报错xe,centos修改端口出现Failed to start OpenSSH server daemon 启动报错和-xe报错的解决方法...
  8. Exchange2010应用地址列表
  9. 利用Python发送短信,用处多多
  10. 搭建cocos2d-x-android环境 Windows XP3 + Eclipse + NDKR7+COCOS2DX(没有用到cygwin和minigw)
  11. Ubuntu 16.04安装Docker-Compose 与 Can't connect to docker from docker-compose
  12. zkcli远程连接_ZooKeeper客户端 zkCli.sh 节点的增删改查
  13. 精选 | 2018年3月R新包推荐
  14. 关于Entity Data model掌握灵活的数据模型 EntityFramework(1)(翻译)
  15. CentOS8 安装 telnet 命令
  16. hanlp 如何快速从分词仅取出人名
  17. diagram怎么记忆_怎样记英语单词本子单词记忆法原则让每个学生真正的
  18. linux 虚拟钢琴程序,用Python制作简单的钢琴程序的教程
  19. albedo diffuse specular
  20. sql语句的编程手册(转)

热门文章

  1. Web浏览器测试,怎么提取测试点 - web测试方法总结
  2. Android App拥有system权限
  3. MASM32 Editor的使用
  4. 中石油职称计算机试题,中石油职称计算机水平考试复习题库22-职称计算机考试其它试卷与试题.pdf...
  5. 简单安装NetBEUI协议
  6. 【官方文档】Fluent Bit 安装在 Kubernetes
  7. 仿花生日记淘宝客双端原生APP网站源码
  8. matlab系统数学模型建立,第五章 matlabsimulink下数学模型的建立
  9. 图解 Excel 添加数据透视表
  10. 小游戏策划案例精选_最具创意大型活动策划案例