我的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表?
答案 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