【问题标题】:Create a mysql primary key without a clustered index?创建没有聚集索引的mysql主键?
【发布时间】:2010-12-07 19:44:25
【问题描述】:

我是一名 SQL Server 人员,正在为即将进行的一个大型项目(由于许可)试验 MySQL,但在创建没有聚集索引的主键的方式上,我没有找到太多信息。我在 5.1 上读过的所有文档都说主键会自动获得一个聚集索引。由于我对主键列 (GUID) 使用二进制 (16),因此我宁愿没有聚集索引。所以...

  1. 是否可以在没有聚集索引的情况下创建主键?我总是可以将聚集索引放在 date_created 列上,但是如何防止 mysql 自动在主键上创建聚集索引?
  2. 如果不可能,在 GUID 列上使用唯一索引且表上没有主键时,我的性能是否可以?我打算在这里使用 nhibernate,所以我不确定是否允许没有主键(还没有那么远)。

【问题讨论】:

    标签: sql mysql indexing


    【解决方案1】:

    这取决于您使用的存储引擎。 MyISAM 表不支持聚集索引,因此 MyISAM 表上的主键不是聚集的。然而,InnoDB 表上的主键是聚集的。

    您应该consult the MySQL Manual 了解有关每个存储引擎的优缺点的更多详细信息。

    你需要有一个主键;如果你不自己创建一个,MySQL 会为你创建一个隐藏的。您总是可以为主键创建一个 AUTO_INCREMENT 字段(我认为这比让 MySQL 在您的表中隐藏字段更好)。

    【讨论】:

      【解决方案2】:

      考虑到13.6.10.1. Clustered and Secondary Indexes 上所说的内容,您似乎无法真正定义聚集索引设置在哪一列:

      • 要么在 PK 列上
      • 或在具有唯一索引且仅包含非空值的第一列上
      • 或在某些内部列上——在你的情况下没那么有用^^

      关于您帖子中的第二个问题:桌子上没有 PK,GUID 上有一个唯一索引;这可能是可能的,但它不会改变聚集索引的任何内容:它仍然可能位于 GUID 列上。


      某种黑客可能是:

      • 没有定义主键
      • 在您的 date_created 字段上放置一个 UNIQUE 索引(如果您在短时间内不创建太多行,它可能是可行的...)

      不确定是否可以在 GUID 上放置第二个 UNIQUE 索引...也许 ^^
      并且不确定聚集索引是否会发生很大变化;但可能值得一试...

      【讨论】:

        猜你喜欢
        • 2012-06-03
        • 2012-01-10
        • 1970-01-01
        • 2012-11-26
        • 2018-10-14
        • 1970-01-01
        • 1970-01-01
        • 2011-05-15
        • 2013-08-30
        相关资源
        最近更新 更多