如何使用内部联接和ORDER BY优化MySQL查询

如何使用内部联接和ORDER BY优化MySQL查询,mysql,sql,Mysql,Sql,鉴于此查询: EXPLAIN SELECT mi.*, i1.sizes as tile_photo_sizes, i1.filename as tile_photo_filename, v.title_cached as venue_title, v.subtitle_cached as venue_subtitle, v.slug as venue_slug FROM menuitems mi INNER JOIN images i1

鉴于此查询:

EXPLAIN
SELECT mi.*, i1.sizes as tile_photo_sizes,
       i1.filename as tile_photo_filename,
       v.title_cached as venue_title,
       v.subtitle_cached as venue_subtitle,
       v.slug as venue_slug
FROM menuitems mi
INNER JOIN images i1 ON i1.id = mi.tile_photo_id
INNER JOIN menus m ON m.id = mi.menu_id
INNER JOIN venues v ON v.id = m.venue_id
WHERE NOT m.is_deleted AND v.slug="teplo" AND
      m.is_published AND v.is_published
ORDER BY mi.number ASC
我想得出以下结果:

我尝试为
join
where
orderby
中使用的每个列添加单独的索引,但它仍然使用临时文件

我不想对其进行优化,但有时这会导致错误,只能通过宿主提供程序来修复:
无法创建/写入文件'/mysql temp/#sql_64e0_0.MYD'(Errcode:17)

最大的表格是菜单(6867),然后是图像(944),菜单(85),场地(79)

UPD:删除订单时不使用临时文件


尝试更改查询,将主联接逻辑放入子查询中,看看解释是否执行得更好:

EXPLAIN
SELECT * FROM (
    SELECT mi.*, i1.sizes as tile_photo_sizes,
       i1.filename as tile_photo_filename,
       v.title_cached as venue_title,
       v.subtitle_cached as venue_subtitle,
       v.slug as venue_slug
    FROM menuitems mi
    INNER JOIN images i1 ON i1.id = mi.tile_photo_id
    INNER JOIN menus m ON m.id = mi.menu_id
    INNER JOIN venues v ON v.id = m.venue_id
    WHERE NOT m.is_deleted AND v.slug="teplo" AND
        m.is_published AND v.is_published
) as t
ORDER BY t.number ASC

这可能会造成另一种临时情况,但我很想为您解释结果。

临时文件是否与您的订单相关?如果您删除ORDER BY,解释计划会发生什么情况?100%时不确定,但可能值得尝试修改“menu_id”上的索引以同时包含“number”列,并查看它是否也可用于ORDER BY。@davidethell,删除ORDER BY不使用临时文件。@Emyl,我已尝试修改索引,但这并没有起作用。看起来这将删除临时表。Filesort只是意味着MySQL无法使用索引来确定仍然不正确的顺序。因此,它应该可以解决您的服务器问题,但仍然不是一个最佳的排序。见本讨论: