【问题标题】:trying to figure out why index isn't being used试图弄清楚为什么没有使用索引
【发布时间】:2015-05-31 01:05:28
【问题描述】:

所以我有两张表,它们有一行共同 - `type`。此行在两个表中都是 KEY,并且两个表中的类型相同 - VARCHAR(4)。问题是,当我使用该列加入表时,EXPLAIN 使它看起来好像该列没有被用作键。

我的架构 + 数据:

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)。在我看来,它应该搜索 3x 行?

SQL 小提琴:

http://sqlfiddle.com/#!9/d6b69d/2

有什么想法吗?

谢谢!

【问题讨论】:

  • 如果您没有足够的数据(例如 2-3 行),则使用索引进行过滤并进行额外查找以获取之后的所有行是不值得的。
  • 给我们看EXPLAIN;我们需要看到这一切。

标签: mysql sql indexing


【解决方案1】:

我几乎没有重命名几列和与下面的答案无关的表名。最初得到你的结果。以下解决了它

analyze table demo;

-- 状态正常

analyze table thetypes;

-- 状态正常

-- 现在表/索引统计信息已更新

-- 在分析表的手册页中注意表级别的读锁

explain select *
from demo d
force index (thetype)
join thetypes t
force index (thetype)
on t.thetype=d.thetype

-- 你会喜欢结果

-- 在手册页中注意关于索引提示使用/强制的措辞

所以无论你是使用 6 行还是 600 万行看看

如果不明显,要获取索引名称,请运行类似

显示演示中的索引;

是的,我将列命名为 thetype 而不是 type

【讨论】:

    猜你喜欢
    • 2020-05-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多