自动索引主键确实好吗?

时间:2016-05-22 20:15:59

标签: mysql indexing

在像MySQL这样的某些DBMS中,主键始终默认为索引。我知道索引可以使索引列的选择和比较等操作更快,但它也可以减慢其他操作,如插入和更新。有些情况下,表的主键上的选择很少,其中索引不会带来太多好处。在这种情况下,不是最好不索引主键吗?

澄清:我刚刚了解到主键实际上是由一个特殊的索引实现的,比如InnoDB的clustered index。索引绝对可以用于强制主键的唯一性约束,但是否真的有必要使用索引来执行此操作?据我所知,索引通常被实现为btree,它可以提高许多操作的性能,而不仅仅是检查唯一性,这可以通过哈希表完成。那么为什么不使用其他更简单的结构来强制对插入和更新操作的性能产生较小负面影响的唯一性呢?

文章here提到了类似的观点:

  

唯一索引使用的空间与非唯一索引一样多。的价值   存储每列以及记录的位置。这可以是一个   如果你使用唯一索引作为约束而从不作为约束,则会浪费   指数。换句话说,您可以依靠唯一索引来强制执行   唯一性但从不编写使用唯一值的查询。在这   例如,MySQL不需要存储每条记录的位置   在索引中:你永远不会使用它们。

在以下段落中:

  

不幸的是,没有办法表明你对MySQL的意图。在   未来,我们可能会发现针对此特定的功能   案件。 MyISAM存储引擎已经支持唯一列   没有索引(它使用基于散列的系统),但机制   尚未在SQL级别公开。

“基于哈希的系统”是我所说的“其他更简单的结构”的一个例子。

2 个答案:

答案 0 :(得分:3)

未编入索引的主键既不是主键也不是键。

你的问题没有意义。

答案 1 :(得分:1)

让我们回顾历史大约20年,当MySQL刚刚开始时。发明人对自己说,"什么索引系统简单有效,通常有用"。答案是BTree。所以,BTree在MySQL中存在了很长时间。然后他问自己"我们应该在PRIMARY KEY"上放些什么花里胡哨的东西。答案是KISS - 与其他UNIQUE索引相同。这是MyISAM引擎。

后来(大约15年前),另一位发明家联合起来。他带来了简单的,但是交易性的InnoDB引擎。由于事务确实需要PK,因此InnoDB具有UNIQUE 聚类的PK。而且,数据+ PK再次是BTree。

每隔一段时间,人们常常会问:#34;我们是否需要位图索引,哈希索引,第二个聚簇索引等等。"答案总是回来,"不,BTree足够好。"已经发明了一些非MySQL引擎来做非BTree索引。也许最成功的是Tokutek及其" Fractal index"。 MariaDB现在包括TokuDB。另一个是"柱状索引" Infinidb。

(如果他们实际上没有问过这些问题,请向Monty和Heikki道歉。)

对于"点查询" Hash和BTree索引的速度大致相同。但对于"范围查询",Hash是无用的,BTree非常好。为什么当一个明显更好时实施两者?