2010-01-21 36 views
24

在学习mysql的,我读了你可以添加将列到MySQL表中执行以下语句:列顺序是否在你的MySQL表中很重要?

ALTER TABLE contacts ADD email VARCHAR(60) AFTER name; 

ALTER TABLE contacts ADD email VARCHAR(60) FIRST; 

你什么时候会想这样做?列顺序可以用于查询优化目的吗? longblobs应该成为最优化空间消耗的最后一列吗?或者出于其他原因存在这些命令?

+0

我从来没有注意到性能方​​面的差异,但我从来没有做过基准测试。我一直认为它主要是一个可用性的东西,让我按照逻辑顺序设置列,即使我稍后回去添加一列。 – ceejayoz

+2

请参阅http://stackoverflow.com/questions/894522/is-there-any-reason-to-worry-about-the-column-order-in-a-table,这表明存在性能影响。 – Matchu

回答

0

不,它不应该。标准化的数据库也不应该对列顺序有限制。

6

但这会影响select * from mytable的结果顺序。

这就是为什么你总是应该在select语句中命名的原因,例如select col1, col2 from mytable。但是,如果您知道该应用使用的是*,那么在添加列时必须小心。

否则,对列进行排序,以便它理解最合理。如果它影响perf,那么这意味着您已经处于数据库性能调优的黑暗面,并且您可能在其他地方存在问题。

0

列顺序无所谓。这纯粹是一种便利功能。只是为了让您在创建数据库表后按照您喜欢的方式重新构建数据库表。

0

关系模型没有关于行内列排序的概念,也没有关于表内行排序的概念。

6

该问题与关系模型或SQL无关。这是一个性能问题。

在某些数据库中,由于执行磁盘访问的方式而以特定方式排列列更有效。是否有显着的优势是平台特定的。它是底层存储设计方式以及引擎访问方式的底层I/O问题。专有的引擎提供商通常通过其教育和培训部门提供这些信息。

我想你必须和那些知道你的特定平台上MySQL的存储模型和I/O方法细节的人谈谈,或者在你的平台上对这个平台进行了长时间标记以获得一个回答。

它们完全有可能以优化的方式将其放置在磁盘上,并隐藏该列。

1

我认为它没有性能,但在某些情况下 - 当您使用索引时。

例子。我用

连接表:

| category_id | user_id | 

这两列分别为unsigned int (10),并primary key (category_id, user_id) 多多关注列的顺序。当我开始从where user_id = ?的表中选择时 - 表现很低。

当我改变列的顺序(先制作user_id)后,它开始选择时间更快。

+1

http://dev.mysql.com/doc/refman/5.6/en/multiple-column-indexes.html – NovaDenizen

+2

组合索引中的列顺序很重要 - 但这与表中的列顺序无关。 (因此,这个'答案'没有解决'问题'。) –

1

A“你想什么时候使用这个”而不是性能问题。

如果主从机的列顺序不同且列类型不兼容(错误1677),则基于行的复制将中断。

ALTER TABLE contacts MODIFY email VARCHAR(60)AFTER name;

将是解决此问题的一种方法。