【问题标题】:Why primary key has no good effect on select?为什么主键对select没有很好的作用?
【发布时间】:2014-02-03 17:22:40
【问题描述】:

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

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

【问题讨论】:

  • 在 a 上定义索引并重试。
  • 主键也是一个索引,我给a加了另一个索引,但是也没任何作用。
  • @Alexander,MySQL 中的主键是索引:stackoverflow.com/a/707896/1788704
  • 试试select * from t1 where a='10000000';。您可能会强制 MySQL 将所有这些字符串转换为整数 - 在这种情况下,字符串上的索引是无用的。
  • @DennisTraub - 它确实表明了我对 MySQL 的偏见。我知道任何明智的 SQL 数据库系统都会执行这样的转换,但我开始不期望 MySQL 做明智的事情:-|

标签: mysql sql select


【解决方案1】:

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

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


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

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

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

【讨论】:

  • 最后我从mysql.com找到了一些有用的信息“对于字符串列与数字的比较,MySQL不能使用列上的索引来快速查找值。” “这样做的原因是有许多不同的字符串可以转换为值 1,例如 '1'、'1' 或 '1a'。”
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 2014-06-04
    • 2013-05-18
    • 2017-03-16
    • 2012-09-18
    • 2011-02-09
    相关资源
    最近更新 更多