索引失效应该避免

案例(索引失效)

# demo 数据
DROP TABLE IF EXISTS `staffs`;
CREATE TABLE `staffs` (`id` int(11) NOT NULL AUTO_INCREMENT,`NAME` varchar(24) NOT NULL COMMENT '姓名',`age` int(11) NOT NULL DEFAULT '0' COMMENT '年龄',`pos` varchar(20) NOT NULL COMMENT '职位',`add_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '入职时间',PRIMARY KEY (`id`),KEY `idx_staffs_nameAgePost` (`NAME`,`age`,`pos`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='员工记录表';-- ----------------------------
-- Records of staffs
-- ----------------------------
INSERT INTO `staffs` VALUES ('1', 'z3', '22', 'manager', '2020-03-14 15:28:53');
INSERT INTO `staffs` VALUES ('2', 'July', '23', 'dev', '2020-03-14 15:29:31');
INSERT INTO `staffs` VALUES ('3', '2000', '23', 'dev', '2020-03-14 15:29:46');

1.全值匹配我最爱

2.最佳左前缀法则

如果索引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始并且不跳过索引中的列。

3.不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描

# 案例:不走索引
explain select * from staffs where left(name,4) ="July";

4.存储引擎不能使用索引中范围条件右边的列

# 案例:不走索引
explain select * from staffs where name = "July" and age > 25 and pos = "manage"

5.尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),
减少select *

6.mysql在使用不等于(!=或者<> )的时候无法使用索引会导致全表扫描

# 案例 :不会走索引
explain select * from staffs where name != 'July'
explain select * from staffs where name <> 'July'

7.is null ,is not null也无法使用索引I

#案例:不会走索引
explain select * from staffs where name is null

8.like以通配符开头(’%abc…)mysql索引失效会变成全表扫描的操作

# 案例:不会走索引
explain select * from staffs where name like  '%July%';
# 案例:会走索引
explain select * from staffs where name like  'July%';

问题:

解决like '%字符串%'时索引不被使用的方法? ?

使用覆盖索引 >是指建立的复合索引的字段

测试数据

CREATE TABLE `tb1_user` (id INT (11) NOT NULL AUTO_INCREMENT,`NAME` VARCHAR (20) DEFAULT NULL,`age` INT (11) DEFAULT NULL,email VARCHAR (20) DEFAULT NULL,PRIMARY KEY (id)
) ENGINE = INNODB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8;INSERT INTO tb1_user(NAME ,age ,email) VALUES('1aa1',21,'b@163.com');
INSERT INTO tb1_user(NAME ,age,email) VALUES('2aa2' ,222,'a@163.com');
INSERT INTO tb1_user(NAME ,age,email) VALUES('3aa3' ,265, 'c@163.com');
INSERT INTO tb1_user(NAME ,age,email) VALUES('4aa4' ,21,'d@163.com');create index idx_user_nameAge on tb1_user(name,age);
# 使用覆盖索引
# 案例 :会走索引
explain select name,age from tb1_user where name like "%aa%";
# 案例: 不会走索引;因为email不是复合索引中的列;没有覆盖到
explain select name,age,email from tb1_user where name like "%aa%";

9.字符串不加单引号索引失效

# 案例 :不会走索引
explain select * from  staffs where name  = 2000;
# 案例 :会走索引
explain select * from  staffs where name  = '2000';

10.少用or,用它来连接时会索引失效

# 案例:不走索引
explain select * from staffs where name='July' OR  name = 'z3';

mysql学习笔记-索引优化【1】-索引失效原因相关推荐

  1. mysql 学习笔记--存储引擎、索引、sq优化

    全面的 mysql学习笔记–通用语法.函数.数据类型.约束.多表查询.事务 全面的 mysql学习笔记–存储引擎.索引.sql优化 全面的mysql学习笔记–视图/存储过程/触发器.锁.InnoDB引 ...

  2. MySQL 学习笔记(18)— 索引的分类、创建、查看、删除等

    1. 索引类型 1.1 唯一索引与非唯一索引 唯一索引( UNIQUE )中的索引值必须唯一,可以确保被索引的数据不会重复,从而实现数据的唯一性约束. 非唯一索引允许被索引的字段存在重复值,仅仅用于提 ...

  3. MySQL学习笔记(六)索引类别

    1.普通索引 MySQL中最基本的索引类型,没有限制,允许重复,允许NULL CREATE INDEX index_code ON tb_student(code); 2.唯一索引 唯一索引跟普通索引 ...

  4. MySQL 学习笔记-第三篇-索引、存储过程和函数、视图、触发器

    目录 1 索引 1.1 索引简介 1.2 创建索引 1.3 删除索引 1.4 MySQL 8.0 的新特性 1 -支持降序索引 1.5 MySQL 8.0 的新特性 2 -统计直方图 2 存储过程和函 ...

  5. MySQL学习笔记(五)—— 索引存储引擎

    索引&存储引擎 一.MySQL存储引擎介绍 1.什么是数据库存储引擎 2.如何查看引擎 建表时指定引擎 修改表的引擎 **MyISAM和InnoDB的区别** 二.索引 1.什么是索引 2.索 ...

  6. JavaEE 企业级分布式高级架构师(六)MySQL学习笔记(6)

    MySQL学习笔记 性能优化篇 性能优化的思路 慢查询日志 慢查询日志介绍 开启慢查询功能 演示一 演示二 分析慢查询日志 MySQL自带的mysqldumpslow 使用percona-toolki ...

  7. MySQL学习笔记-主键索引和二级索引

    文章目录 MySQL学习笔记-主键索引和二级索引 1.笔记图 2.索引的常见模型 3.InnoDB 的索引模型 4.主键索引和普通索引查询的区别 5.如何选择主键字段 6.笔记图 7.回表过程 8.最 ...

  8. mysql,oracle数据库优化之索引

    mysql,oracle数据库优化之索引,分库分表,表分区,本地索引,全局索引 数据库引擎 数据库索引 索引类型 主键索引 唯一索引 普通索引 全文索引 位图索引(oracle数据库才有) 在哪些列上 ...

  9. MySQL 学习笔记②

    若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/BV1Kr4y1i7ru 资料链接 ...

  10. 数据库MySQL学习笔记高级篇(周阳)

    数据库MySQL学习笔记高级篇 1. mysql的架构介绍 mysql简介 高级Mysql mysqlLinux版的安装 mysql配置文件 mysql逻辑架构介绍 mysql存储引擎 2. 索引优化 ...

最新文章

  1. SQLServer之函数简介
  2. MAVEN项目环境搭建
  3. python 布尔值为f我的_python – 为什么我没有得到布尔值?
  4. java 数据包含_如何高效判断java数组是否包含某个值
  5. yii 使用 有赞sdk_有赞ABTest系统:数据驱动增长实践
  6. HDOJ---2236 无题II[二分枚举+匈牙利]
  7. 阿里开源首个深度学习框架 X-Deep Learning!
  8. php excel header,【IT专家】PHP生成excel,方法一-header生成
  9. 漫画:从修灯泡来看各种 IT 岗位,你是哪一种?
  10. 网站显示网页加载时间代码-Typecho
  11. Android Studio 无法浏览插件市场
  12. 在datagrid中的toolbar添加输入框
  13. [Java] 蓝桥杯 BASIC-4 基础练习 数列特征
  14. SCWS中文分词,向xdb词库添加新词
  15. Netflix:如何打造开放协作的实时 ETL 平台?
  16. 如何实现一个无边框Form的移动和改变大小(一)
  17. 2015 年全国电赛题——风力摆控制系统(B 题)
  18. HDU 2122 Ice_cream’s world III
  19. git lfs linux,Git LFS(学习笔记)
  20. 如果我们遇上得州寒潮,会不会「悲剧」?

热门文章

  1. Markdown教程--Markdown代码
  2. 1309460-27-2,Ald-Ph-PEG4-acid苯甲醛基与酰肼和氨基氧基
  3. 浮云API 随机二次元图片接口开放文档 1w+数据
  4. 《宣州谢眺楼饯别校书叔云》赏析
  5. 【border相关】【P3426】 [POI2005]SZA-Template
  6. c语言跳马思路,跳马问题 - 日拱一卒的个人空间 - OSCHINA - 中文开源技术交流社区...
  7. 如何设置无线路由连接无线wifi
  8. 利用python绘制自定义棋盘格
  9. 百度智能云携手鄂尔多斯市:大数据赋能,让房子有了身份证会说话
  10. WIN10本地搭建APACHE+PHP运行环境