次の自己結合クエリがあります。
SELECT A.id
FROM mytbl AS A
LEFT JOIN mytbl AS B
ON (A.lft BETWEEN B.lft AND B.rgt)
クエリは非常に遅く、実行計画を見ると、原因は JOIN でのフル テーブル スキャンにあるようです。テーブルには 500 行しかありません。これが問題ではないかと疑って、オプティマイザーの選択に違いが生じるかどうかを確認するために、100,000 行に増やしました。そうではありませんでした.100k行では、まだ完全なテーブルスキャンを実行していました.
私の次のステップは、次のクエリでインデックスを強制しようとすることでしたが、同じ状況が発生し、フル テーブル スキャンが発生します。
SELECT A.id
FROM categories_nested_set AS A
LEFT JOIN categories_nested_set AS B
FORCE INDEX (idx_lft, idx_rgt)
ON (A.lft BETWEEN B.lft AND B.rgt)
すべての列 (id、lft、rgt) は整数で、すべてインデックスが付けられます。
MySql がここでフル テーブル スキャンを実行するのはなぜですか?
全テーブル スキャンの代わりにインデックスを使用するようにクエリを変更するにはどうすればよいですか?
CREATE TABLE mytbl ( lft int(11) NOT NULL DEFAULT '0',
rgt int(11) DEFAULT NULL,
id int(11) DEFAULT NULL,
category varchar(128) DEFAULT NULL,
PRIMARY KEY (lft),
UNIQUE KEY id (id),
UNIQUE KEY rgt (rgt),
KEY idx_lft (lft),
KEY idx_rgt (rgt) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
ありがとう