待处理的数据过多,导致过度容器爆满
当我们要在数据库中更新或者插入数据的时候,这些是待处理的字段,会储存到一个临时的容器(redo log 日记),待空闲时才会将这些待处理的数据一条一条的同步到磁盘,而当数据库不断更新,数据庞大的时候,容器被填满,所以为了数据不丢失,会停止其他的操作,全身心的将数据同步到磁盘,这时候sql的语句执行的就会很慢。
需要的表被占用
当你在执行一个语句的时候,应到的表刚好被别人占用,并且加了锁,或者所需要的某一行被加锁,这样只能等他解锁了。只能等!!!
如果要判断是否真的在等待锁,我们可以用 show processlist这个命令来查看当前的状态
索引就是书的目录
先建一个表来说明问题。
1
2
3
4
5
6
7mysql> CREATE TABLE `t` ( `id` int(11) NOT NULL, `c` int(11) DEFAULT NULL, `d` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ;
如果c没有建一个索引的话,执行下面的代码就要所有的数据都扫描一遍,会导致运行的SQL语句很慢。
1
2select * from t where c > 10 ;
当然了,加上索引以后,就像是读书一样,有了目录,找你想要读的文章就快了很多。但是如果c在左边已经计算过了,那么索引就用不到了
1
2select * from t where c - 1 = 1000;
当你把索引写进函数里那么索引依旧是用不到的
1
2select * from t where pow(c,2) = 1000;
改成下面这样的就可以用到索引了,
1
2select * from t where c = 1000 + 1;
数据库内的索引的时候,如果数据库内的数据基数很大,而系统采样取到的索引的数量很少,那么他就会认为数据的基数很小,就会全部扫描一遍(系统搞错了),所以会运行慢
总结
1、大多数情况下很正常,偶尔很慢,则有如下原因
(1)、数据库在刷新脏页,例如 redo log 写满了需要同步到磁盘。
(2)、执行的时候,遇到锁,如表锁、行锁。
2、这条 SQL 语句一直执行的很慢,则有如下原因。
(1)、没有用上索引:例如该字段没有索引;由于对字段进行运算、函数操作导致无法用索引。
(2)、数据库选错了索引。
最后
以上就是香蕉金毛最近收集整理的关于一条SQL语句执行得很慢的原因有哪些?(索引)的全部内容,更多相关一条SQL语句执行得很慢内容请搜索靠谱客的其他文章。
发表评论 取消回复