数据准备

按照如下代码创建生成范围内随机整数函数、固定长度随机字符串、创建 student 表和 class 表、创建随机过程自动向表中插入数据,数据由随机函数随机生成。最后调用随机过程得到数据供学习使用。

CREATE DATABASE dbtest01;set global log_bin_trust_function_creators=TRUE;DELIMITER //
CREATE FUNCTION `rand_num`(from_num INT, to_num INT)
RETURNS INT
BEGINDECLARE i INT DEFAULT 0;SET i = FLOOR(from_num + RAND() * (to_num - from_num + 1));RETURN i;
END //
DELIMITER;DELIMITER //
CREATE FUNCTION `rand_string`(n INT)
RETURNS VARCHAR(255) CHARSET utf8mb4
BEGINDECLARE chars_str VARCHAR(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';DECLARE ret_str VARCHAR(255) DEFAULT '';DECLARE i INT DEFAULT 0;WHILE i < n DOSET ret_str = CONCAT(ret_str,SUBSTRING(chars_str,FLOOR(1 + RAND() * 52), 1));SET i = i + 1;END WHILE;RETURN ret_str;
END //
DELIMITER ;CREATE TABLE `class`(
`id` INT(11) NOT NULL AUTO_INCREMENT,
`className` VARCHAR(30) DEFAULT NULL,
`address` VARCHAR(40) DEFAULT NULL,
`monitor` INT NULL,
PRIMARY KEY(`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;CREATE TABLE `student`(
`id` INT(11) NOT NULL AUTO_INCREMENT,
`stuno` INT NOT NULL,
`name` VARCHAR(20) DEFAULT NULL,
`age` INT(3) DEFAULT NULL,
`classId` INT(11) DEFAULT NULL,
PRIMARY KEY(`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;DELIMITER //
CREATE PROCEDURE `insert_stu`(`start` INT, `max_num` INT)
BEGINDECLARE i INT DEFAULT 0;SET autocommit = 0;REPEATSET i = i + 1;INSERT INTO student(stuno, name, age, classId)VALUES((`start` + i), rand_string(6), rand_num(16, 20), rand_num(1000000, 9999999));UNTIL i = max_numEND REPEAT;COMMIT;
END //
DELIMITER;DELIMITER //
CREATE PROCEDURE `insert_class`(`max_num` INT)
BEGINDECLARE i INT DEFAULT 0;SET autocommit = 0;REPEATSET i = i + 1;INSERT INTO `class`(className, address, monitor)VALUES(rand_string(8), rand_string(10), rand_num(1, 100));UNTIL i = max_numEND REPEAT;COMMIT;
END //
DELIMITERE;CALL insert_class(10000);CALL insert_stu(100000, 500000);

索引失效的11种情况

  • 全值索引

在没有索引的情况下, 做如下查询语句耗时0.179s

 添加索引:CREATE INDEX idx_age ON student(age);  后再次执行此查询语句:

可见查询时间减少,但是减少的并没有想象中的多,分析原因应该是生成数据时age限定在16-20岁之间了,导致大面积的重复age数据,所以对age创建索引效果并不好,这也和之前文章中提到的不适合创建索引的情况相吻合。

再添加如下所以:CREATE INDEX idx_age_classid_name ON student(age, classId, `name`);

查看上面查询语句的执行计划:

发现此时只会使用新创建的联合索引,单索引成为冗余索引,此时单索引 idx_age 已失效,应当删除 。

  • 最佳左前缀法则

此时索引 idx_age_classId_name 将失效,无法使用。

注:若查询字段为age和name,idx_age_classId_name 可以使用,但只能使用关于 age的索引,即Key_len=5;

  • 主键插入顺序
  • 计算、函数、导致索引失效

查看以上俩查询语句的执行计划,发现第一个使用了索引,第二个没有使用索引。

  • 类型转换导致索引失效

  •  范围条件的右边的列的失效

key_len = 10 说明联合索引只使用了前两个,关于name的所有并没有使用到。这是因为关于classId的查询是范围性的,导致其右侧的其余联合索引列失效。 故创建联合索引时,务必将涉及到范围查询的字段写在最后。

  • 不等于(!= 或 <>)索引失效

  • IS NULL可以使用索引,IS NOT NULL 不能使用索引

  •  LIKE 以 通配符 % 开头索引失效

页面搜索严禁左模糊或者全模糊!!!

  •  OR 前后存在非所以的列, 索引失效

  • 数据库和表的字符集统一使用 utf8mb4 

统一字符集可避免由于字符集转换导致的索引失效!!!不同的字符集在比较前需要进行 转换 或造成索引失效!!!

MySQL索引失效的11种情况相关推荐

  1. MySQL索引失效的9种情况(针对InnoDB存储引擎)

    前言 MySQL中提高查询性能的最有效的方式之一就是对数据表合理的设计索引,优秀的索引的设计方案很大程度上可以提高查询的性能. 因此,索引对查询的速度有着至关重要的影响. 为了尽量的使优化器用到我们的 ...

  2. 详解MySQL索引失效的几种情况

    MySQL索引是提高查询效率的重要手段.索引失效会导致查询效率下降,甚至全表扫描,影响数据库性能.以下是可能导致MySQL索引失效的情况: 1. 使用or操作符 当where语句中使用or操作符并且o ...

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

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

  4. [索引] 索引失效的几种情况

    一.单表索引失效的几种情况 建立员工记录表 CREATE TABLE `staffs` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255 ...

  5. sql索引失效的几种情况

    sql索引失效的几种情况 1.使用 != 或者 <> 导致索引失效 2.类型不一致导致索引失效 3.函数导致索引失效 4.运算符导致索引失效 5.模糊搜索导致索引失效 6.NOT IN.N ...

  6. MySQL 索引失效的 15 种场景!

    背景 无论你是技术大佬,还是刚入行的小白,时不时都会踩到Mysql数据库不走索引的坑.常见的现象就是:明明在字段上添加了索引,但却并未生效. 前些天就遇到一个稍微特殊的场景,同一条SQL语句,在某些参 ...

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

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

  8. mysql索引失效_导致MySQL索引失效的几种常见写法

    最近一直忙着处理原来老项目遗留的一些SQL优化问题,由于当初表的设计以及字段设计的问题,随着业务的增长,出现了大量的慢SQL,导致MySQL的CPU资源飙升,基于此,给大家简单分享下这些比较使用的易于 ...

  9. MySQL索引失效的几种常见场景

    前言 我们在使用MySQL查询数据的时候,总会遇见没有正确使用到索引的情况. 这里我们列举几种常见的,搜索条件使用了索引列却没有走索引的场景. (以下测试均在MySQL8.0.28中完成,且所有数据均 ...

  10. 索引失效的几种情况和原因剖析

    在网上看到很多关于索引失效的情况,但是看了感觉都讲的不过明确,或者只告诉你这么查询会导致索引失效但是却没有告诉你索引失效的原因,这里做一些详细的说明. 一般我们常见的出现索引失效的有这么几个原因 1, ...

最新文章

  1. 详细!看看顶级互联网公司都在研究的无服务器架构!
  2. 642-832 GNS3 自搭建拓扑
  3. Jquery属性选择器(同时匹配多个条件,与或非)(附样例)
  4. 第二章(jQuery选择器)
  5. leetcode541. 反转字符串 II
  6. Oracle入门(十四.21)之创建DML触发器:第二部分
  7. Entity Data Model (EDM) 深入分析, Part 3
  8. [深度学习]Python/Theano实现逻辑回归网络的代码分析
  9. LEBERT:基于词汇增强的中文NER模型
  10. 定制适用于ARM平台的Ubuntu rootfs(根文件系统)
  11. jQuery基础知识--选择器与效果
  12. 小学生都能看懂的生成函数入门教程
  13. for循环批量写文件 shell_Shell脚本编程03下——Shell编程之循环语句
  14. 表单式工作流功能模块设计方案
  15. 史上MySQL安装配置教程最细,一步一图解
  16. Unity开发手机游戏从第一行代码到Taptap上线,我经历了什么
  17. java求圆柱体体积面积(接口继承、字符串常用方法)
  18. python中sys模块是干什么的_python中sys模块的介绍和使用
  19. 2022智源大会议程丨类脑计算前沿与挑战
  20. android技术交流群 付费群,QQ群付费入群功能停止服务是怎么回事?QQ付费入群功能停止服务详情一览[多图]...

热门文章

  1. 02.二叉树打印.md
  2. C语言逻辑运算符,位运算符总结
  3. 内存带宽测试工具 mbw
  4. 在js中的瀑布流布局理解
  5. MSI Center局域网管理器开启导致电脑网络质量变差、网速低
  6. 网页中超长图片转成pdf文档
  7. Word中插入公式后行距变大的解决办法
  8. 两个分数化简比怎么化_化简比的六种方法
  9. 如何下载哔哩哔哩视频
  10. 带动画的自定义view——做一个移动的箭头