【问题标题】:Two sets of indentical tables with joins using indexes in MySQL; one requires full-table scan使用 MySQL 中的索引进行连接的两组相同表;一个需要全表扫描
【发布时间】:2010-02-14 19:36:32
【问题描述】:

我对 MySQL 中的索引感到非常困惑。

我有两个表:TableA1 和 TableA2。

我为它们之间的连接创建了索引,并且查询运行得非常快。

我还有另外 2 个设置相同的表,例如表 B1 和表 B2。唯一的区别是这些表有几个空值。

由于某种原因,TableA 上的相同查询大约快 5 倍,并且不需要全表扫描。然而,TableB 似乎使用了全表扫描,我不知道为什么。会不会是 Null 值导致了这种情况?

我注意到在 TableA 设置中使用 EXPLAIN,我得到了 possible keys: myindexref: func;但是在 TableB 设置中,我只得到 possible keys: NULLref: NULL

我已经搜索了很长时间,似乎找不到相关的答案。如果有人能指出我正确的方向,将不胜感激。

(对不起,现在添加到原始问题中。)

这是 TableAOne:

CREATE TABLE `TableAOne` (
  `field1` varchar(255) DEFAULT NULL,
  `field2` varchar(255) DEFAULT NULL,
  KEY `myindex` (`field1`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

还有TableATwo:

CREATE TABLE `TableATwo` (
  `Field3` varchar(255) ,
  `Field4` varchar(255) ,
  `Field5` varchar(255) ,
  `id` int(20) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=15522 DEFAULT CHARSET=utf8;

我正在与 Field1 一起加入 Field3。

获得全表扫描的表与上述表相同。唯一的区别是它们被称为 TableB 而不是 TableA。

干杯,

【问题讨论】:

  • 你能发布你的创建表脚本,也许还有每个表的行数吗?
  • NULL 是链接 B 表的有效值吗?如果没有,请在 JOIN 条件中使用 AND b2.col IS NOT NULLWHERE b1.col IS NOT NULL 排除它们
  • 是的 null 是一个有效值,也有一些空值(不确定这是否明智!!),我想保留空值和空值,我将发布创建表一会儿也
  • 两个“相同”的表表明您没有正确规范化。我们是否将其解释为字面正确?如果是,为什么需要?
  • 请重新编辑您的问题并包括查询和解释计划。另外,我不太清楚您是否发布了所有涉及的表定义。旁注:我注意到您的一个表是 InnoDB,另一个是 MyISAM,也许“相同”表之间的区别是?

标签: mysql indexing full-table-scan


【解决方案1】:

我刚刚删除了表格并将其重新安装到数据库中(我确实将 utf8 更改为 latin1 不确定这是否有影响),但是现在它可以工作了,真的很奇怪!非常感谢 v 的所有回复,他们肯定将我推向答案欢呼:)

【讨论】:

  • 原来是 utf8 vs latin1 字符集导致了问题。
猜你喜欢
  • 2016-11-24
  • 2020-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
  • 2017-06-24
相关资源
最近更新 更多