主键中的列顺序,性能

时间:2014-10-08 10:34:23

标签: mysql performance primary-key

出于性能原因,我有一个小问题。

我正在使用symfony和doctrine。我总是在我的实体中使用注释,最近决定切换到yml文件。

所以我在外部导出了所有实体并生成了yml文件。

我将yml文件与数据库进行了比较。生成了一个diff文件,它会删除某些表上的主键,然后按照不同的顺序添加它们。这些主键有多列。

似乎只有当其中一列是外键时才会发生这种情况。

问题是我是否可以对数据库执行更改并切换键列的顺序,或者它是否会影响我的性能?

1 个答案:

答案 0 :(得分:2)

MySQL中的主键使用唯一索引实现。实际上,现在对于大多数(如果不是全部)SQL dbms来说都是如此。

索引中列的顺序很重要。 Changing the order当然可以改变效果。

  

MySQL可以对测试所有内容的查询使用多列索引   索引中的列,或仅测试第一列的查询,   前两列,前三列,依此类推。如果你指定   索引定义中的列顺序正确,单个   复合索引可以加快几种查询的速度   表

可能是改变订单的好理由。请参阅Using Foreign Key Constraints

  

MySQL要求外键和引用键上的索引   外键检查可以很快,不需要表扫描。在里面   引用表时,必须有一个索引所在的外键   列以相同顺序列为第一列。这样的   如果不是,则会自动在引用表上创建索引   存在。如果您创建,可能会稍后以静默方式删除此索引   另一个可用于强制执行外键约束的索引。

如果您的程序将外键列放在新主键中,这个可能是他们试图解决的问题。他们试图避免在主键列上创建索引,而仅在外键列上创建附加索引。

但这并不意味着它不会损害特定查询的性能。

至少有两种测试方法。首先,您可以启动一个新数据库,将您的应用程序连接到它,然后运行它。它看起来足够快吗?

其次,您可以使用EXPLAIN启动新数据库并手动运行部分或全部查询。