数据库内容仅9100文章但是在点击此查询时
SELECT *
FROM `ABC`
WHERE st=6 AND publish_on <= '2018-02-01'
ORDER BY rand() LIMIT 5
Query_time:1.043072 Lock_time:0.000081 Rows_sent:5 Rows_examined:19354
但是:
Select count(*) from ABC;
它返回:
9100
为什么检查19354行?
答案 0 :(得分:2)
您可以在此link中看到rand()
函数的工作原理。
在这个link上,您可以看到ORDER BY
的工作原理:
我认为你的查询检查了19354行(比表行总数多的行),因为使用order by rand()
的组合,rand()不是表的列(所以没有排序键)因此dbms必须扫描表超过1次。如果您按表格的列排序,我不确定,但可能dbms不需要只扫描一次表。
此外,执行ORDER BY rand() LIMIT 5
的效率非常低,因为您之前订购的是9100行而不是仅选择5行。
答案 1 :(得分:1)
Rows_examined: 19354
意味着此查询未得到优化。它检查 19354 行以产生结果。
EXPLAIN SELECT 输出只是优化器根据信息所做出的 guess 关于它认为将与搜索条件匹配的索引记录的数量MySQL关于索引中密钥的分配。如您所见,返回的实际行数可能不同。