2010-01-21 71 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;

將是解決此問題的一種方法。