我是否必须使用MySQL的整数auto-inc主键?

时间:2015-02-22 16:38:48

标签: mysql database

我有一个拥有超过3500万行的MySQL数据库表。我最初创建了一个id字段作为主键。但是这个id字段只是一个auto_increment值,不属于我的数据。但我的主要查询是在一个名为zipcode的字段上。

使用WHERE zipcode=''进行的查询似乎非常慢。我意识到索引zipcode字段会加快这一速度。但是,我注意到索引的每个字段占用了一定的空间。邮政编码索引的索引仅占用75MB,但“id”字段主键索引占用超过3GB。

由于我没有使用“id”字段,我现在已经删除了id字段,只保留了zipcode字段的索引。我只觉得id领域无缘无故占据了空间。没有唯一的id字段有什么缺点吗?

我可以通过其他方式加快对此数据库表的查询速度吗?

1 个答案:

答案 0 :(得分:1)

通过维护主键,甚至是所谓的代理主键(如自动增量id列),可以获得一些显着优势。

首先,如果您需要使用phpMyadmin或MySQL workbench等工具,它可以让您编辑表格。如果没有主键,则这些工具无法更新您的表格。

另一方面,在InnoDB中,主键是每个索引的默认部分,因此使用索引的操作变得更快。例如,如果您想在表格中找到包含最多人口的条目,您可以这样做:

SELECT *
  FROM tabl t
  JOIN ( SELECT ID
           FROM tabl
          ORDER BY population DESC
          LIMIT 10
       )  s ON s.ID = t.ID

如果你索引population并且你有一个主键,那么这将非常快,例如。

你说你的ID索引消耗3GB。总结一下,1TB磁盘驱动器的成本为100美元。因此,您的3GB索引使用价值0.30美元的资源。节省空间是一种错误的优化。

不要删除主键。