选择查询检查的行数多于表中存在的行数

时间:2014-02-01 10:43:45

标签: mysql sql database mysqli

数据库内容仅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行?

2 个答案:

答案 0 :(得分:2)

您可以在此link中看到rand()函数的工作原理。

在这个link上,您可以看到ORDER BY的工作原理:

  1. 像以前一样读取与WHERE子句匹配的行。
  2. 对于每一行,记录由排序键组成的值元组 值和行位置,以及查询所需的列。
  3. 按排序键值
  4. 对元组进行排序
  5. 按排序顺序检索行,但请读取所需的列 直接从排序的元组而不是通过访问表a 第二次。
  6. 我认为你的查询检查了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关于索引中密钥的分配。如您所见,返回的实际行数可能不同。