【发布时间】:2016-11-24 12:00:52
【问题描述】:
我有以下自联接查询:
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
谢谢
【问题讨论】:
-
分享
show create table xyz对每个相关xyz的结果 -
结果如下:
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 -
A
PRIMARY KEY是UNIQUE键是KEY。所以这两个KEYs是多余的,应该去掉。
标签: mysql indexing self-join mptt full-table-scan