EXPLAIN 関数を教えてくれた MrCleanX に感謝します。(ここでより良い言い回しのために他の質問を削除しました)...クエリにORDER BY句を追加すると、基本的に「検査された行」が大幅に増加します。
テーブル:
packages と package_to_tag の両方が MyISAM を実行しています
次のように構成されています。
パッケージ の日付は索引付けされています。
+----------------+------------------+----------------+
| aid(primary) | source | date(index) |
+----------------+------------------+----------------+
| 1 | CA | 2013-04-05 |
+----------------+------------------+----------------+
| 2 | FL | 2013-05-05 |
+----------------+------------------+----------------+
| 3 | UT | 2012-06-13 |
+----------------+------------------+----------------+
| 4 | VT | 2011-04-29 |
+----------------+------------------+----------------+
| 5 | CT | 2013-04-10 |
+----------------+------------------+----------------+
package_to_tag package-tag の一意のインデックスであり、package_aid とタグの両方にインデックスがあります
+---------------+------------------+
| package_aid | tag |
+---------------+------------------+
| 2 | sports |
+---------------+------------------+
| 2 | nba |
+---------------+------------------+
| 1 | food |
+---------------+------------------+
| 1 | burrito |
+---------------+------------------+
| 4 | hockey |
+---------------+------------------+
| 4 | sports |
+---------------+------------------+
| 3 | news |
+---------------+------------------+
| 5 | sports |
+---------------+------------------+
| 5 | nba |
+---------------+------------------+
私の基本的なクエリは次のとおりです。
SELECT package_aid, source
FROM package_to_tag
RIGHT JOIN packages ON packages.aid = package_to_tag.package_aid
WHERE tag IN("sports","nba")
GROUP BY package_aid
HAVING COUNT(*) = 2
ORDER BY date DESC
LIMIT 500;
「説明」すると、package_to_tag テーブル (1.5 ミル付近) のすべてのレコードを調べていることがわかります。
ただし、ORDER BY 句を削除すると、これははるかに扱いやすい 30k に削減されます。
完全な結果のスクリーン キャップ。
パッケージ:
package_to_tag:
ORDER BY で説明します。
ORDER BY なしで説明:
package_to_tag のインデックス:
package_to_tag テーブルのすべての行を含めずにソートを維持するにはどうすればよいですか?