这是我的桌子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)
为什么选择主键和普通字段一样快?
答案 0 :(得分:5)
尝试select * from t1 where a='10000000';
。
你可能强迫MySQL将所有这些字符串转换为整数 - 因为整数的类型优先级高于varchar
- 在这种情况下,字符串上的索引是无用的
实际上,显然,我有点不对劲。通过阅读conversions文档,我相信在MySQL中我们最终会强制比较的两边都转换为float
,因为我看不到上面的任何要点:
在所有其他情况下,参数将被比较为浮点(实数)。
将匹配一侧的字符串和另一侧的整数。
答案 1 :(得分:1)
数据存储在几乎所有数据库中的块中。读块是IO的基本单元。 索引有助于系统将数据块归零,该数据块保存我们正在尝试读取的数据并避免读取所有数据块。在具有单个或极少数据块的非常小的表中,索引的使用实际上可能是开销,并且可能完全被跳过。即使使用,索引也很少提供任何性能优势。在相当大的桌子上尝试相同的实验。
PS:索引和密钥(主键)不是可互换的概念。前者是物理的,后者是合乎逻辑的。