:SELECT *
を使用しないでください。代わりに、必要な列の名前を付けます。
第2:user_device.userid
に一致するものを探しています。したがってuser_device
のインデックスはuserid
の列で始まる必要があります。同じテーブルにdeviceid
の値を使用しています。したがって、このインデックスを作成します。それはcovering indexと呼ばれています。
ALTER TABLE user_device ADD INDEX x_user_device (userid, deviceid);
サード:あなたはその後、id
により発注、deviceid
によってevents
内の行を探しています。したがって、これら2つの列に別のcovering indexが必要です。
ALTER TABLE events ADD INDEX x_device_id (deviceid, id);
第四:あなたはWHERE句であなたのLEFT JOINしたテーブルの列に言及します。これはLEFT JOINを通常の内部JOINに変換します。したがって、JOINを使用してください。
第5:SELECT * ... ORDER BY ... LIMIT
は、悪名高いパフォーマンスの反パターンです。どうして?それはレコードの全面的な混乱を命じなければなりません、少数を除くすべてを捨てるためです。代わりにこれを試してください。まずサブクエリで関連するevents.id
の値を取得します。
SELECT events.id
FROM events
JOIN user_device ON user_device.deviceid=events.deviceid
WHERE user_device.userid=101
ORDER BY events.id DESC
LIMIT 5
サブクエリをテストします。 5つの関連するイベントID値を与える必要があります。それは実際には非常に迅速に行う必要があります。次に、このサブクエリを使用して、2つのテーブルから必要な詳細を検索します。
SELECT events.*, user_device.* /* not optimal. list only the columns you need */
FROM (
SELECT events.id
FROM events
JOIN user_device ON user_device.deviceid=events.deviceid
WHERE user_device.userid=101
ORDER BY events.id DESC
LIMIT 5
) sel
JOIN events ON sel.id = events.id
JOIN user_device ON events.deviceid = user_device.deviceid
これは、遅延結合クエリパターンと呼ばれます。 id
の値だけをすべて並べ替えて、いくつかのレコードを取り出します。
これは、データベースの拡大に合わせてパフォーマンスをチェックするのに役立ちます。
特定のレコードを取得した場合は、手動で書き込みし、クエリから '* 'を削除してください。 – Bhargav
クエリのパフォーマンスに関するセクションに特に注意して読んでください。 http://meta.stackoverflow.com/a/271056/質問を編集して詳細を入力してください。 –