ORDER BY查询复制到tmp表中

时间:2014-02-24 01:55:01

标签: mysql sql

我的MYSQL查询:

select id, title, slug, price, image, cat
  from demo
 where main_cat = 1
 order by id desc
 limit 200000, 20

解释详情:

select_type : SIMPLE
table : demo 
type :ref 
possible_keys :main_cat 
key :main_cat  
key_len:4  
ref :const 
rows :9050910 
Extra :Using where; Using filesort

MySQL documentation说:

Temporary tables can be created under conditions such as these:

            If there is an ORDER BY clause and a different GROUP BY clause,or 
if the ORDER BY or GROUP BY contains columns from tables other than the first 
table in the join queue, a temporary table is created.

...

我的查询只包含ORDER BY,为什么要转到TMP表?

1 个答案:

答案 0 :(得分:0)

您可以找出标准错误代码的含义:

$ perror 28
OS error code  28:  No space left on device

因此,在/ tmp所在的文件系统上没有足够的空间。它可能写了好一段时间,但试图编写一个太大的结果集。

您的EXPLAIN输出不显示临时表。但它确实显示“使用filesort”,如果结果集足够大,它也可以使用磁盘空间。

例如,如果必须排序200000行以查找偏移量。 : - )

您的image列是BLOB中的实际图片吗?这可以解释结果集的大小。

使用带有非常大数量的LIMIT进行偏移不是一个好主意。 MySQL必须先生成整个结果集才能进行偏移。

最好通过而非位置进行偏移。

select id, title, slug, price, image, cat
  from demo
 where main_cat = 1 and id < $lowest_id_from_previous_page
 order by id desc
 limit 20