6

このクエリを考えると:

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、、で使用される列ごとに個別のインデックスを追加しようとしましたwhereorder by、それでも一時ファイルを使用します。

私はそれを最適化したくありませんが、時々これはホスティングプロバイダーによってのみ修正できるエラーになります: Can't create/write to file '/mysql-temp/#sql_64e0_0.MYD' (Errcode: 17)

最大のテーブルはmenuitems(6,867)で、次に画像(944)、メニュー(85)、会場(79)が表示されます。

UPD:ORDERBYの削除は一時ファイルを使用しません

ここに画像の説明を入力してください

4

1 に答える 1

0

クエリを変更して、メインのJOINロジックをサブクエリに入れ、EXPLAINのパフォーマンスが向上するかどうかを確認してください。

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

これにより、別の一時的な状況が発生する可能性がありますが、EXPLAINの結果について興味があります。

于 2012-11-27T13:35:11.857 に答える