私は以下の自己結合クエリを持っている:のMySql - 自己が参加 - 全表スキャン(インデックスをスキャンすることはできません)
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行ではまだ完全なテーブルスキャンを行っていませんでした。
私の次のステップは、次のクエリでのインデックスを試してみて、力になったが、同じ状況が発生し、全表スキャン:すべての列(ID、LFT、RGT)は
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)
整数であり、すべてインデックスされます。
ここで、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
おかげ
共有ショー 'の結果は、各関連XYZについては、以下 – Drew
結果テーブルxyz'を作成する:クエリの固定された未定着バージョン間機能を説明する比較 '表mytblをCREATEを( LFTはint(11)NOT NULL DEFAULT '0'、 RGT int型(11)DEFAULT NULLを、 ID int型(11)DEFAULT NULLを、 カテゴリVARCHAR(128)のDEFAULT NULL、 PRIMARY KEY(LFT)、 UNIQUEキーID (id)、 ユニークキーrgt(rgt)、 KEY idx_l KEY idx_rgt(rgt) )ENGINE = InnoDB DEFAULT CHARSET = utf8' – mils
'PRIMARY KEY'は' UNIQUE'キーが 'KEY'です。したがって、2つのKEYは重複しており、削除する必要があります。 –