【问题标题】:Do I have to use a integer auto-inc primary key with MySQL?我必须在 MySQL 中使用整数 auto-inc 主键吗?
【发布时间】:2015-02-22 16:38:47
【问题描述】:

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

使用WHERE zipcode='' 进行的查询似乎很慢。我意识到索引邮政编码字段可以加快速度。但是,我注意到每个被索引的字段都会占用一定的空间。 zipcode字段的索引只占用75MB,但“id”字段主键索引占用3GB以上。

由于我没有将“id”字段用于任何内容,因此我现在删除了 id 字段并仅将索引保留在 zipcode 字段中。我只是觉得 id 字段无缘无故地占用了空间。没有唯一的 id 字段有什么缺点吗?

还有什么其他方法可以加快对该数据库表的查询速度?

【问题讨论】:

  • 如果你附上你的表格列列表会更有帮助:)
  • 我删除了您的一个标签:MySQL != SQL Server(后者是 Microsoft 产品)。
  • 您的邮政编码字段现在是否声明为PRIMARY?行应始终通过主键唯一标识(但不必是整数或自增)。
  • @halfer 不,邮政编码字段不是主键,它只是被索引。它不能是主键,因为每个 zipcode 值平均有 25 条记录与之关联。
  • 好吧,我会坚持使用主键。 Read more here.

标签: mysql database


【解决方案1】:

维护主键有一些显着的优势,即使是所谓的代理主键,如自动递增的id 列。

一方面,如果您需要使用 phpMyadmin 或 MySQL 工作台等工具,它可以让您编辑您的表格。如果没有主键,这些工具将无法更新您的表。

另一方面,在 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 美元的资源。节省空间是一种错误的优化。

不要删除主键。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-22
    相关资源
    最近更新 更多