2011-05-30 77 views
3

我正在与一名合同开发人员合作开发人员,他正在开始创建表(MySQL)而不定义主键。相反,他使用AUTO_INCREMENT定义了一个具有UNIQUE约束的列。我从来没有见过这样做,所以我想了解这样定义表的含义。 如果需要,一个缺点是无法创建外键。以这种方式创建表格有什么其他影响,无论好坏。也许我在这里错过了一个概念......MySQL将列定义为UNIQUE并使用AUTO_INCREMENT而不是主键

+0

在这种情况下,您仍然可以创建外键。 Mysql甚至不需要对父列 – a1ex07 2011-05-30 19:44:47

回答

6

定义MySQL没有显式主键是一个非常非常糟糕的主意。
如果缺少PK,MySQL将创建一个隐含的(但非常真实的)整数自动增量主键。
此PK将包含在InnoDB的每个辅助键中,并将决定您在MyISAM中的主要排序顺序。

后果
你刚才放缓的每一个性能选择,插入和更新。
没有目的,所以永远。

InnoDB的:去表数据
在InnoDB的一个额外的查找需要进行必需的,因为所有二级指标指的是PK,而不是行自己额外的查找。

的MyISAM:浪费空间
在MyISAM的处罚是不是很大,但你还是沿着不习惯于一个4字节的未使用的字段拖动。

的InnoDB +的MyISAM:无用代自动增量场
的因为隐式自动增量PK被创建,你还需要一个额外的自动递增键来执行联接;为了防止重复的自动增量字段,您现在没有1个,但每个插入2个表锁。

InnoDB的:与加入上述查找probem双打
如果联接使用领域,这不是PK之时,InnoDB需要做一个额外的查找每联接去其他的记录表。

InnoDB的:最糟糕的是你失去了覆盖索引的利益
你在InnoDB的最佳优化,覆盖索引的残疾人之一。
如果MySQL只能使用索引中的数据解析查询,它将永远不会读取表,这会导致显着的速度增益。现在,InnoDB中每个索引的50%都是未使用的空间,因此您不会使用该优化的机会。

请用线索棒击败这个承包商!
enter image description here

链接:
http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/(低速链路,但推荐阅读)。
O'Reilly on InnoDB's covering indexes http://tag1consulting.com/MySQL_Engines_MyISAM_vs_InnoDB

BTW,如果你的承包商说,但这并没有多大意义,因为他使用的MyISAM,再次击败他,你应该总是使用InnoDB,除非你有一个很好的理由不是太。
InnoDB在生产上更加安全,MyISAM有它的用途,但也很容易被破坏。

+0

+1的唯一约束,看起来我的回答很天真! – 2011-05-30 23:34:36

0

这不会阻止外键,但会影响使用该字段的查询的性能。每当你必须查询一个表并指定一些标准来根据列的值过滤记录(例如WHERE子句)时,应该使用索引。

-1

主键只是一个与NOT NULL约束相结合的唯一索引,如果您在没有PK的情况下满足这些要求,那么在性能方面没有任何伤害,当然它仍然没有多大意义,因为它会混乱。