原标题:明明我建了索引,为什么sql执行的还是这么慢?

很多同学经常遇到这样一个问题,就是为了避免sql 执行缓慢,提前将各种可能用到的字段都添加上索引,查询的时候尽可能的使用这些字段,避免全表扫描。可是,明明我已经添加了索引,问什么还是这么慢呢?

一条 SQL 语句执行的很慢,那是每次执行都很慢呢?还是大多数情况下是正常的,偶尔出现很慢呢?所以我觉得,我们还得分以下两种情况来讨论。

大多数情况是正常的,只是偶尔会出现很慢的情况。

在数据量不变的情况下,这条SQL语句一直以来都执行的很慢。

针对这两种情况,我们来分析下可能是哪些原因导致的。

一、针对偶尔很慢的情况

一条 SQL 大多数情况正常,偶尔才能出现很慢的情况,针对这种情况,我觉得这条SQL语句的书写本身是没什么问题的,而是其他原因导致的,那会是什么原因呢?

1、数据库在刷新脏页

当我们要往数据库插入一条数据、或者要更新一条数据的时候,我们知道数据库会在内存中把对应字段的数据更新了,但是更新之后,这些更新的字段并不会马上同步持久化到磁盘中去,而是把这些更新的记录写入到 redo log 日记中去,等到空闲的时候,在通过 redo log 里的日记把最新的数据同步到磁盘中去。数据库在在同步数据到磁盘的时候,就有可能导致我们的SQL语句执行的很慢了。

2、拿不到锁

这个就比较容易想到了,我们要执行的这条语句,刚好这条语句涉及到的表,别人在用,并且加锁了,我们拿不到锁,只能慢慢等待别人释放锁了。或者,表没有加锁,但要使用到的某个一行被加锁了,这个时候,我也没办法啊。

下来我们来访分析下第二种情况,我觉得第二种情况的分析才是最重要的。

二、针对一直都这么慢的情况

我们先来假设我们有一个表,表里有下面两个字段,分别是主键 id,和两个普通字段 c 和 d。并建立相关索引。

mysql> CREATE TABLE `t` (

`id` int(11) NOT ,

`c` int(11) DEFAULT ,

`d` int(11) DEFAULT ,

PRIMARY KEY (`id`)

) ENGINE=InnoDB;

1、没用到索引

没有用上索引,我觉得这个原因是很多人都能想到的,例如你要查询这条语句:

select * from t where 100

1)字段有索引,但却没有用索引

好吧,这个时候你给 c 这个字段加上了索引,然后又查询了一条语句:

select * from t where c - 1 = 1000;

3)函数操作导致没有用上索引

如果我们在查询的时候,对字段进行了函数操作,也是会导致没有用上索引的,例如:

select * from t where pow(c,2) = 1000;

2、数据库自己选错索引

我们在进行查询操作的时候,例如:

select * from t where 100 < c and c < 100000;

就算你在 c 字段上有索引,系统也并不一定会走 c 这个字段上的索引,而是有可能会直接扫描扫描全表,找出所有符合 100 < c and c < 100000 的数据。

为什么会这样呢?系统是有可能走全表扫描而不走索引的。

那系统是怎么判断呢?

判断来源于系统的预测,也就是说,如果要走 c 字段索引的话,系统会预测走 c 字段索引大概需要扫描多少行。如果预测到要扫描的行数很多,它可能就不走索引而直接扫描全表了。

那么问题来了,系统是怎么预测判断的呢?这里我给你讲下系统是怎么判断的吧,虽然这个时候我已经写到脖子有点酸了。

系统是通过索引的区分度来判断的,一个索引上不同的值越多,意味着出现相同数值的索引越少,意味着索引的区分度越高。我们也把区分度称之为基数,即区分度越高,基数越大。所以呢,基数越大,意味着符合 100 < c and c < 10000 这个条件的行数越少。

所以呢,一个索引的基数越大,意味着走索引查询越有优势。

三、总结

建了索引,并且使用了索引字段,并不代表着查询一定走索引。sql 执行缓慢存在多种可能,具体问题具体分析吧。添加索引,慎用函数,根据规则避免走全表扫描。优化是一个过程,需要慢慢琢磨。

ps:看更多干货,加入技术交流微信群可以关注我的公众号360linker返回搜狐,查看更多

责任编辑:

MySQL创建索引跳过redo_明明我建了索引,为什么sql执行的还是这么慢?相关推荐

  1. mysql 非自然月统计_技本功|统计信息对SQL执行效率的影响

    点击蓝字 关注我们 在正文开始前,我们先补充一轮知识点. DING! 什么叫统计信息? 统计信息是数据库对所有表信息进行数据抽样后得出的数据统计,它是一个数据库优化器选择最佳执行计划的核心依据. 什么 ...

  2. mysql 设置时区_MySQL实战干货 | 如何处理由时区设置引发的 SQL 执行“卡顿”?...

    作者:田杰,阿里云数据库高级运维专家 查询执行时间长引发应用感知 "卡顿" 的场景在数据库的日常支持和使用中并不少见,但由于时区设置引发的 SQL 执行"卡顿" ...

  3. mysql创建表对经常要查询的列添加索引或者组合索引

    创建表的时候对经常要查询的列添加索引或者组合索引 索引直接影响后面的查询性能,尤其是数据量越大的时候,影响越明显.作为一个从事DBA生涯超过5年的DBA,遇到过无数次由于没有添加索引,导致的线上故障, ...

  4. mysql创建数据表代码_MYSQL 简单的建库操作代码

    一.查询所有数据库 代码:show databases; 成功后如下图: 二.建立一个数据库 代码:create database test3: 成功后如下图: 三.连接数据库 代码:use test ...

  5. 在Linux系统的命令行中为MySQL创建用户的方法

    这篇文章主要介绍了在Linux系统的命令行中为MySQL创建用户的方法,包括对所建用户的权限管理,需要的朋友可以参考下 要访问一个MySQL服务器,你需要使用一个用户帐号登录其中方可进行.每个MySQ ...

  6. 《MySQL必修课:狙击海量数据!教你如何进行索引分析与SQL查询优化!》

    文章目录 本章学习目标 第一节 索引分析与优化 1.1 EXPLAIN 1.2回表查询 1.3覆盖索引 1.5 LIKE查询 1.6 NULL查询 1.7索引与排序 第二节查询优化 2.1 慢查询定位 ...

  7. MySQL创建索引-阿里云开发者社区

    如果你在查询时常用类似以下的语句: SELECT * FROM mytable WHERE category_id=1; 最直接的应对之道,是为category_id建立一个简单的索引: CREATE ...

  8. 高性能Mysql——创建高性能索引详解

    索引(在MySQL中也叫做"键(key)")是存储引擎用于快速找到记录的一种数据结构.这是索引的基本功能,除此之外,本章还将讨论索引其他一些方面有用的属性. 索引对于良好的性能非常 ...

  9. mysql创建唯一性降序索引_MySQL 8 新特性之降序索引底层实现

    什么是降序索引 大家可能对索引比较熟悉,而对降序索引比较陌生,事实上降序索引是索引的子集. 我们通常使用下面的语句来创建一个索引: create index idx_t1_bcd on t1(b,c, ...

最新文章

  1. linux 数据恢复 ext3grep rm -rf
  2. python快速编程入门黑马-新手如何快速入门Python编程?/开发python入门教程
  3. StringBuffer笔记
  4. Docker Network 配置,自定义bridge网络
  5. 工业控制中无线局域网应用前景分析
  6. MySQL案例-open too many files,MyISAM与partition
  7. 小程序如何调用php程序,微信小程序调用PHP后台接口 解析纯html文本
  8. 使用Linq时要注意的事项
  9. maven生命周期所有阶段_Maven构建生命周期,阶段和目标
  10. 利用if...else if....else循环语句编程
  11. 基于confd和etcd的tuxedo中间件容器化方案
  12. R语言连续变量正态性检验
  13. 中国塑料加工工业协会侵犯群益公司名誉权 法院判决赔偿财产损失和赔礼道歉30天
  14. 安卓手机权限总结安卓权限列表
  15. android 蒙版控件,Android开发UI之给ImageView添加蒙版
  16. Cesium 视频融合,边缘模糊
  17. shell脚本IFS的概念
  18. 浅谈微信小程序对于创业者,意味着什么?
  19. 计算机技术对身体有益,对眼睛有益的7种食物,常看电脑和手机的你一定要多吃!...
  20. 开发落网电台windows phone 8应用的计划(7)

热门文章

  1. 直播预告 | 亚马逊高级应用科学家熊元骏:人类行为理解研究进展
  2. java实验7线程2020.5.28
  3. yoyo思维题(困难) 组合数学
  4. twitter api 无法连接_光大银行牟健君:金融API的安全问题和应对技术
  5. c语言链表与字符结合,C语言实现双链表的(终端)添加和查询
  6. JavaScript——易班优课YOOC课群在线测试自动答题解决方案(十三)自动答题
  7. Raising Modulo Numbers
  8. php下载的文件不是汉字,php实现支持中文的文件下载功能示例
  9. 记一个mysql分页查询优化试验
  10. redis+aop防重复提交