我有以下MySQL表(只有845行):MySQL的 - 全表掃描的連接查詢
CREATE TABLE `categories_nested_set` (
`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_lftrgtid` (`id`,`lft`,`rgt`),
KEY `idx_lft` (`lft`),
KEY `i1` (`lft`) USING BTREE,
KEY `i2` (`rgt`) USING BTREE,
KEY `i3` (`id`) USING BTREE,
CONSTRAINT `fk_categories_nested_set_id_category` FOREIGN KEY (`id`) REFERENCES `categories` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
(你可以看到我有一大堆指標在裏面,以防萬一)。
我執行以下自連接查詢:
SELECT *
FROM categories_nested_set AS H
LEFT JOIN categories_nested_set AS I ON (H.lft > I.lft)
產生以下講解:
id,select_type,table,type,possible_keys,key,key_len,ref,rows,Extra
1,SIMPLE,H,ALL,NULL,NULL,NULL,NULL,845,NULL
1,SIMPLE,I,ALL,"PRIMARY,idx_lft,i1",NULL,NULL,NULL,845,"Range checked for each record (index map: 0x31)"
的EXPLAIN會建議MySQL是選擇不使用索引,我不明白爲什麼。表定義顯示所有相關的列都被編入索引。
在一個更大的查詢(500萬行,14x表)範圍內,這件事證明是一個巨大的瓶頸。任何意見,將不勝感激。
感謝,
運行'EXPLAIN'的數據集確實只有845行嗎?例如,如果數據集足夠小,MySQL不一定會使用索引。您應該在實際較大的查詢中獲得性能統計信息。 –
是的,只有845行。對較大的查詢有不同的解釋,顯然要詳細得多,但仍然是全表掃描。 – mils
那麼你需要至少進行一次全表掃描,以查看連接左側的表格。 –