为什么主键对select没有好的效果?

时间:2014-01-15 09:51:53

标签: mysql sql select

这是我的桌子t1;它有一百万行。

CREATE TABLE `t1` (
  `a` varchar(10) NOT NULL,
  `b` varchar(10) DEFAULT NULL,
  `c` varchar(10) DEFAULT NULL,
  `d` varchar(10) DEFAULT NULL,
  `e` varchar(10) DEFAULT NULL,
  `f` varchar(10) DEFAULT NULL,
  `g` varchar(10) DEFAULT NULL,
  `h` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |

结果:

mysql> select * from t1 where a=10000000;
Empty set (1.42 sec)

mysql> select * from t1 where b=10000000;
Empty set (1.41 sec)

为什么选择主键和普通字段一样快?

2 个答案:

答案 0 :(得分:5)

尝试select * from t1 where a='10000000';

你可能强迫MySQL将所有这些字符串转换为整数 - 因为整数的类型优先级高于varchar - 在这种情况下,字符串上的索引是无用的


实际上,显然,我有点不对劲。通过阅读conversions文档,我相信在MySQL中我们最终会强制比较的两边都转换为float,因为我看不到上面的任何要点:

  

在所有其他情况下,参数将被比较为浮点(实数)。

将匹配一侧的字符串和另一侧的整数。

答案 1 :(得分:1)

数据存储在几乎所有数据库中的块中。读块是IO的基本单元。 索引有助于系统将数据块归零,该数据块保存我们正在尝试读取的数据并避免读取所有数据块。在具有单个或极少数据块的非常小的表中,索引的使用实际上可能是开销,并且可能完全被跳过。即使使用,索引也很少提供任何性能优势。在相当大的桌子上尝试相同的实验。

PS:索引和密钥(主键)不是可互换的概念。前者是物理的,后者是合乎逻辑的。