创建没有聚集索引的mysql主键?

时间:2009-10-18 18:18:41

标签: sql mysql indexing

我是一个SQL Server人员正在试验一个即将发布的大型项目(由于许可),我没有找到很多信息来创建没有聚集索引的主键。我在5.1上读到的所有文档都说主键自动被赋予聚簇索引。由于我使用二进制(16)作为主键列(GUID),我宁愿没有聚集索引。所以......

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

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

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

  • 它位于PK列
  • 或第一列具有仅具有非空值的UNIQUE索引
  • 或某些内部专栏 - 在您的案例中没有用^^

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


某种黑客攻击可能是:

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

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