免费游戏网站建设,微信网站是什么意思,手机网站表单页面制作,网页游戏制作引擎一条 SQL 查询语句执行的很慢#xff0c;那是每次查询都很慢呢#xff1f;还是大多数情况下是正常的#xff0c;偶尔出现很慢呢#xff1f;可以分以下两种情况来讨论。大多数情况是正常的#xff0c;只是偶尔会出现很慢的情况。在数据量不变的情况下#xff0c;这条SQL语…一条 SQL 查询语句执行的很慢那是每次查询都很慢呢还是大多数情况下是正常的偶尔出现很慢呢可以分以下两种情况来讨论。大多数情况是正常的只是偶尔会出现很慢的情况。在数据量不变的情况下这条SQL语句一直以来都执行的很慢。一、平常执行快偶尔很慢针对这种情况可以理解为这条SQL语句的书写本身是没什么问题的。而是其他原因导致的那会是什么原因呢(1) 数据库在刷新脏页(flush)要往数据库中插入、更新一条数据时数据库会先在内存中将这一条数据更新但却不会立即持久化到磁盘中而是把这些记录写入到redo log中等到空闲的时候再从redo log中把数据同步到磁盘中去。当内存数据页跟磁盘数据页内容不一致的时候我们称这个内存页为“脏页”。内存数据写入到磁盘后内存和磁盘上的数据页的内容就一致了称为“干净页”。redo写满了redo log的容量是有限的当数据库一直很忙更新又比较频繁此时redo log很快被写满数据库就只能先暂停其他操作全身心将数据同步到磁盘中去所以说数据库在在同步数据到磁盘的时候就有可能导致我们的SQL语句执行的很慢了。内存不够了另外当一次性查询的数据太多又恰好碰到所查询的数据也不在内存中需要申请内存而此时恰好内存不足就需要淘汰一部分内存数据页如果是干净页就直接释放如果是脏页就需要刷新。(2) 拿不到锁当我们要执行的这条语句它涉及到的表或行刚好别人在用且加了锁那我们拿不到锁就只能慢慢等别人释放锁了。如果要判断是否真的在等待锁我们可以用 show processlist 这个命令来查看当前的状态。二、一直都很慢如果在同一数据量的情况下其他SQL语句执行速度都很快唯独这条 SQL 语句每次都执行的这么慢那就就要好好反思一下你的 SQL 语句了(1) 没有用到索引这种情况又要细分a、字段没有建索引b、字段有索引但是没有用上比如说select * from table_A a where a.no1100 ( 就算在no列建立了索引但是对左边做了运算会导致索引失效 )c、 函数操作导致索引失效比如说一个字段name你对它用了str()或一些其他函数也会导致索引失效(2) 数据库选错索引就算某个字段例如name建立了索引但系统也会去评估按照索引搜索快还是全表扫描快而它判断的依据是什么呢采用取样的方式来估计数据量所以如果样品数据不能代表整体数据就会导致偏差数据库就会误判。这种情况下可以强制使用索引例如 select * from table_A a force index(ind) where 10 a.no and a.no10000;三、总结一个 SQL 执行的很慢我们要分两种情况讨论1、平常执行快偶尔很慢则有如下原因a、数据库在刷新脏页例如 redo log 写满了需要同步到磁盘。b、执行的时候遇到锁如表锁、行锁。2、一直都很慢则有如下原因。a、没有用上索引例如该字段没有索引由于对字段进行运算、函数操作导致无法用索引。b、数据库选错了索引。