试图找出为什么没有使用索引

时间:2015-05-31 01:05:28

标签: mysql sql indexing

所以我有两个共同的行表 - “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

有什么想法吗?

谢谢!

1 个答案:

答案 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而不是键入