我有以下自联接查询:
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
谢谢