我是靠谱客的博主 香蕉金毛,最近开发中收集的这篇文章主要介绍一条SQL语句执行得很慢的原因有哪些?(索引),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

待处理的数据过多,导致过度容器爆满

当我们要在数据库中更新或者插入数据的时候,这些是待处理的字段,会储存到一个临时的容器(redo log 日记),待空闲时才会将这些待处理的数据一条一条的同步到磁盘,而当数据库不断更新,数据庞大的时候,容器被填满,所以为了数据不丢失,会停止其他的操作,全身心的将数据同步到磁盘,这时候sql的语句执行的就会很慢。

需要的表被占用

当你在执行一个语句的时候,应到的表刚好被别人占用,并且加了锁,或者所需要的某一行被加锁,这样只能等他解锁了。只能等!!!
如果要判断是否真的在等待锁,我们可以用 show processlist这个命令来查看当前的状态

索引就是书的目录

先建一个表来说明问题。

mysql> CREATE TABLE `t` (
`id` int(11) NOT NULL,
`c` int(11) DEFAULT NULL,
`d` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ;

如果c没有建一个索引的话,执行下面的代码就要所有的数据都扫描一遍,会导致运行的SQL语句很慢。

select * from t where c > 10 ;

当然了,加上索引以后,就像是读书一样,有了目录,找你想要读的文章就快了很多。但是如果c在左边已经计算过了,那么索引就用不到了

select * from t where c - 1 = 1000;

当你把索引写进函数里那么索引依旧是用不到的

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

改成下面这样的就可以用到索引了,

select * from t where c = 1000 + 1;

数据库内的索引的时候,如果数据库内的数据基数很大,而系统采样取到的索引的数量很少,那么他就会认为数据的基数很小,就会全部扫描一遍(系统搞错了),所以会运行慢

总结

1、大多数情况下很正常,偶尔很慢,则有如下原因
(1)、数据库在刷新脏页,例如 redo log 写满了需要同步到磁盘。
(2)、执行的时候,遇到锁,如表锁、行锁。
2、这条 SQL 语句一直执行的很慢,则有如下原因。
(1)、没有用上索引:例如该字段没有索引;由于对字段进行运算、函数操作导致无法用索引。
(2)、数据库选错了索引。

最后

以上就是香蕉金毛为你收集整理的一条SQL语句执行得很慢的原因有哪些?(索引)的全部内容,希望文章能够帮你解决一条SQL语句执行得很慢的原因有哪些?(索引)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部