所以我有两个共同的行表 - “type”。这两个表中的这行是KEY,两个表中的类型相同 - VARCHAR(4)
。问题是,当我使用该列加入表时,EXPLAIN使它看起来像该列没有被用作KEY。
我的架构+数据:
CREATE TABLE demo (
id INT AUTO_INCREMENT,
`type` VARCHAR(4),
data VARCHAR(255),
PRIMARY KEY (id),
KEY `type` (`type`)
);
CREATE TABLE types (
id INT AUTO_INCREMENT,
`type` VARCHAR(4),
`desc` VARCHAR(255),
PRIMARY KEY (id),
KEY `type` (`type`)
);
INSERT INTO demo (type, data) VALUES ('AAAA','aaaa'),('AAAA','aaaa'),('BBBB', 'bbbb');
INSERT INTO types (type, `desc`) VALUES ('AAA','aaaa'),('BBBB','bbbb');
我的查询:
EXPLAIN SELECT *
FROM demo d
JOIN types t ON d.`type` = t.`type`;
根据EXPLAIN,查询不会搜索3x行(3 * 1) - 它必须搜索6x行(3 * 2)。在我看来它应该搜索3行?
SQL小提琴:
http://sqlfiddle.com/#!9/d6b69d/2
有什么想法吗?
谢谢!
答案 0 :(得分:-1)
我几乎没有重命名几个列和与下面的答案无关的表名。最初得到你的结果。以下解决了它
analyze table demo;
- 状态确定
analyze table thetypes;
- 状态确定
- 所以现在更新了表/索引统计信息
- 请在分析表的手册页中注意表级别的readlock
explain select *
from demo d
force index (thetype)
join thetypes t
force index (thetype)
on t.thetype=d.thetype
- 你会喜欢结果
- 注意关于索引提示的verbeage在手动分页中使用/ force
所以无论你是使用6行还是600万,都要看一眼
获取索引名称(如果不明显的话)运行
从demo演示索引;
是的我将列命名为thetype而不是键入