【发布时间】:2010-02-14 19:36:32
【问题描述】:
我对 MySQL 中的索引感到非常困惑。
我有两个表:TableA1 和 TableA2。
我为它们之间的连接创建了索引,并且查询运行得非常快。
我还有另外 2 个设置相同的表,例如表 B1 和表 B2。唯一的区别是这些表有几个空值。
由于某种原因,TableA 上的相同查询大约快 5 倍,并且不需要全表扫描。然而,TableB 似乎使用了全表扫描,我不知道为什么。会不会是 Null 值导致了这种情况?
我注意到在 TableA 设置中使用 EXPLAIN,我得到了 possible keys: myindex 和 ref: func;但是在 TableB 设置中,我只得到 possible keys: NULL 和 ref: 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 NULL和WHERE b1.col IS NOT NULL排除它们 -
是的 null 是一个有效值,也有一些空值(不确定这是否明智!!),我想保留空值和空值,我将发布创建表一会儿也
-
两个“相同”的表表明您没有正确规范化。我们是否将其解释为字面正确?如果是,为什么需要?
-
请重新编辑您的问题并包括查询和解释计划。另外,我不太清楚您是否发布了所有涉及的表定义。旁注:我注意到您的一个表是 InnoDB,另一个是 MyISAM,也许“相同”表之间的区别是?
标签: mysql indexing full-table-scan