私はSQLの第一人者から遠く離れており、実行しようとしています:
SELECT `apps`.* FROM `apps`
INNER JOIN `similars`
ON (`apps`.id = `similars`.similar_app_id OR `apps`.id = `similars`.app_id)
WHERE (`similars`.app_id = 542
OR `similars`.similar_app_id = 542)
AND apps.id <> 542
ORDER BY field(`similars`.app_id, 542) desc LIMIT 6
order by を使用すると、order by を使用しない場合よりも 20 倍遅くなります。
explain extended
SELECT DISTINCT `apps`.*
FROM `apps`
INNER JOIN `similars`
ON (`apps`.id = `similars`.similar_app_id
OR `apps`.id = `similars`.app_id)
WHERE (`similars`.app_id = 542
OR `similars`.similar_app_id = 542) AND apps.id <> 542
ORDER BY `similars`.app_id - 542 desc
私に与えます:
+----+-------------+----------+-------------+----- -------------------------------------------------- ------------+-------------------------------------------------+- --------+------+-------+----------+--------------- -------------------------------------------------- ------------------------------+ | | ID | select_type | テーブル | タイプ | 可能な_キー | キー | key_len | 参照 | 行 | 行 フィルタリングされた | エクストラ | +----+-------------+----------+-------------+----- -------------------------------------------------- ------------+-------------------------------------------------+- --------+------+-------+----------+--------------- -------------------------------------------------- ------------------------------+ | | 1 | シンプル | 類似品 | インデックスマージ | index_app_id_and_similar_app_id,index_app_id,index_similar_app_id | index_app_id,index_similar_app_id | 5,5 | ヌル | 241 | 100.00 | union(index_app_id,index_similar_app_id); の使用 where を使用します。一時的な使用; ファイルソートの使用 | | | 1 | シンプル | アプリ | 範囲 | プライマリ | プライマリ | 4 | ヌル | 21493 | 100.00 | where を使用します。結合バッファーの使用 | +----+-------------+----------+-------------+----- -------------------------------------------------- ------------+-------------------------------------------------+- --------+------+-------+----------+--------------- -------------------------------------------------- ------------------------------+
app_id、similar_app_id、およびそれらの複合体のインデックスのすべての組み合わせを試しました。
ヒントやコツはありますか?
ありがとう