私は何年も前に構築したチャット サイトのクエリを持っていますが、大量のトラフィックが原因で、クエリの設計が不十分であることがわかりました。ここに、長いクエリ ログの例を示します。
SELECT DISTINCT user.id
FROM user
STRAIGHT_JOIN user_pics
ON user.id=user_pics.uid
STRAIGHT_JOIN user_account
ON user_account.user_id=user.id
WHERE registered = 1 AND
user.id<>0 AND
user.id<>23847 AND
user.id<>12392... (IT HAS LITERALLY 1000 OF THESE)
AND user_pics.main=1 AND
user_pics.approved=1 AND
user_pics.deleted<>1 AND
gender LIKE '%female%' AND
country LIKE '%United Kingdom%' AND
city LIKE '%birmingham%' AND
sexorientation LIKE '%Straight%'
ORDER BY updatedate DESC
LIMIT 20;
クエリの実行には約 15 秒かかります。参照するすべての列にもインデックスを付けました。1000 個の "AND user.id<>0" マークを一時テーブルへのルックアップに置き換えると、クエリが改善されます。行って変更を加える前に尋ねると思いました。コードの有用な変更を推奨できる場合は、非常に感謝しています。
編集: "user.id<>23847" マークは、単純な選択によって php で作成され、次に foreach 配列ループによって大きな SQL クエリに追加されます。
EDIT 2:「not in」を使用することで、クエリが13秒から0.3秒に短縮されました。