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

Mysql 为什么主键对select没有很好的效果?,mysql,sql,select,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 N

这是我的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)

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

几乎所有数据库中的数据都以块的形式存储。读取数据块是IO的基本单位。 索引有助于系统调零数据块,该数据块保存我们试图读取的数据,并避免读取所有数据块。在一个只有一个或很少数据块的非常小的表中,索引的使用实际上可能是一种开销,可能会被完全跳过。即使使用,索引也很少提供任何性能优势。在一张相当大的桌子上做同样的实验


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

几乎所有数据库中的数据都以块的形式存储。读取数据块是IO的基本单位。 索引有助于系统调零数据块,该数据块保存我们试图读取的数据,并避免读取所有数据块。在一个只有一个或很少数据块的非常小的表中,索引的使用实际上可能是一种开销,可能会被完全跳过。即使使用,索引也很少提供任何性能优势。在一张相当大的桌子上做同样的实验


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

尝试
select*fromt1,其中a='10000000'

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


事实上,很明显,我有点错了。通过阅读文档,我相信在MySQL中,我们最终会强制将比较的双方转换为
float
,因为我看不到上面的任何要点:

在所有其他情况下,参数作为浮点(实数)数进行比较


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

尝试
select*fromt1,其中a='10000000'

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


事实上,很明显,我有点错了。通过阅读文档,我相信在MySQL中,我们最终会强制将比较的双方转换为
float
,因为我看不到上面的任何要点:

在所有其他情况下,参数作为浮点(实数)数进行比较


这将在一端匹配字符串,在另一端匹配整数。

在a上定义一个索引,然后重试。主键也是一个索引,我在a上添加了另一个索引,但也没有任何效果。@Alexander,MySQL中的主键是一个索引:try
select*from t1,其中a='10000000'。您可能正在强制MySQL将所有这些字符串转换为整数——在这种情况下,字符串上的索引是无用的。@DennisTraub——这正好表明我对MySQL的偏见。我知道任何明智的SQL数据库系统都会执行这样的转换,但我不希望MySQL做明智的事情:-在a上定义一个索引,然后再试一次。主键也是一个索引,我在a上添加了另一个索引,但它也没有任何效果。@Alexander,MySQL中的主键是一个索引:Try
select*fromt1,其中a='10000000'。您可能正在强制MySQL将所有这些字符串转换为整数——在这种情况下,字符串上的索引是无用的。@DennisTraub——这正好表明我对MySQL的偏见。我知道任何明智的SQL数据库系统都会执行这样的转换,但我并不期望MySQL做明智的事情:-最后我在MySQL.com上找到了一些有用的信息“为了比较字符串列和数字,MySQL无法使用列上的索引快速查找值。”“原因是有许多不同的字符串可能会转换为值1,例如“1”、“1”或“1a”。“最后我从mysql.com上找到了一些有用的信息”对于字符串列与数字的比较,mysql无法使用列上的索引快速查找值。“”原因是有许多不同的字符串可以转换为值1,例如“1”、“1”或“1a”