出于性能原因,我有一个小问题。
我正在使用symfony和doctrine。我总是在我的实体中使用注释,最近决定切换到yml文件。
所以我在外部导出了所有实体并生成了yml文件。
我将yml文件与数据库进行了比较。生成了一个diff文件,它会删除某些表上的主键,然后按照不同的顺序添加它们。这些主键有多列。
似乎只有当其中一列是外键时才会发生这种情况。
问题是我是否可以对数据库执行更改并切换键列的顺序,或者它是否会影响我的性能?
答案 0 :(得分:2)
MySQL中的主键使用唯一索引实现。实际上,现在对于大多数(如果不是全部)SQL dbms来说都是如此。
索引中列的顺序很重要。 Changing the order当然可以改变效果。
MySQL可以对测试所有内容的查询使用多列索引 索引中的列,或仅测试第一列的查询, 前两列,前三列,依此类推。如果你指定 索引定义中的列顺序正确,单个 复合索引可以加快几种查询的速度 表
可能是改变订单的好理由。请参阅Using Foreign Key Constraints。
MySQL要求外键和引用键上的索引 外键检查可以很快,不需要表扫描。在里面 引用表时,必须有一个索引所在的外键 列以相同顺序列为第一列。这样的 如果不是,则会自动在引用表上创建索引 存在。如果您创建,可能会稍后以静默方式删除此索引 另一个可用于强制执行外键约束的索引。
如果您的程序将外键列放在新主键中,这个可能是他们试图解决的问题。他们试图避免在主键列上创建索引,而仅在外键列上创建附加索引。
但这并不意味着它不会损害特定查询的性能。
至少有两种测试方法。首先,您可以启动一个新数据库,将您的应用程序连接到它,然后运行它。它看起来足够快吗?
其次,您可以使用EXPLAIN启动新数据库并手动运行部分或全部查询。