我正在與一名合同開發人員合作開發人員,他正在開始創建表(MySQL)而不定義主鍵。相反,他使用AUTO_INCREMENT定義了一個具有UNIQUE約束的列。我從來沒有見過這樣做,所以我想了解這樣定義表的含義。 如果需要,一個缺點是無法創建外鍵。以這種方式創建表格有什麼其他影響,無論好壞。也許我在這裏錯過了一個概念......MySQL將列定義爲UNIQUE並使用AUTO_INCREMENT而不是主鍵
回答
定義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%都是未使用的空間,因此您不會使用該優化的機會。
請用線索棒擊敗這個承包商!
鏈接:
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有它的用途,但也很容易被破壞。
+1的唯一約束,看起來我的回答很天真! – 2011-05-30 23:34:36
這不會阻止外鍵,但會影響使用該字段的查詢的性能。每當你必須查詢一個表並指定一些標準來根據列的值過濾記錄(例如WHERE子句)時,應該使用索引。
主鍵只是一個與NOT NULL約束相結合的唯一索引,如果您在沒有PK的情況下滿足這些要求,那麼在性能方面沒有任何傷害,當然它仍然沒有多大意義,因爲它會混亂。
- 1. Mysql - 將auto_increment添加到主鍵
- 2. 遷移主鍵使用AUTO_INCREMENT
- 3. Mysql - 將列改爲AUTO_INCREMENT
- 4. MySQL服務器存儲過程AUTO_INCREMENT UNIQUE
- 5. 將MySQL auto_increment設置爲依賴於另外兩個主鍵
- 6. mySQL可以根據另一列將特定列定義爲UNIQUE嗎?
- 7. 爲主鍵列使用mediumint而不是int的好處?
- 8. MySQL - INSERT IGNORE增加auto_increment主鍵
- 9. php mySQL pdo auto_increment行的主鍵
- 10. 使用php mysql將auto_increment主值設置爲其他字段
- 11. Biginteger auto_increment主鍵Phinx
- 12. 重置主鍵AUTO_INCREMENT
- 13. Perl DBI MySQL:檢查列是否爲UNIQUE
- 14. 數據表合併而不主鍵列
- 15. MySQL Select Unique with Unique列
- 16. mysql:如何將列更改爲PK Auto_Increment
- 17. MySQL:如何將varchar(255)UNIQUE列更改爲UNIQUE文本NOT NULL?
- 18. 如何使ID「主鍵」基於行而不是AUTO_INCREMENT的字段集編號
- 19. SqlServer使用MySql創建表,如auto_increment主鍵
- 20. 如何創建複合主鍵是否已定義主鍵。 MySQL
- 21. Un-UNIQUE列mysql
- 22. MySql使用主索引而不是多列第一列!
- 23. 在帶有非主鍵的列上使用SqlAlchemy和MySQL設置AUTO_INCREMENT?
- 24. 使用IF NOT EXISTS的主鍵和聚簇列的UNIQUE插入
- 25. 使用PHP計算唯一行而不使用MYSQL(UNIQUE)
- 26. 1 auto_increment與2個主鍵
- 27. 休眠不尊重MySQL的auto_increment主鍵字段
- 28. 如何將不帶AUTO_INCREMENT主鍵的現有DB模式轉換爲具有AUTO_INCREMENT的鍵?
- 29. 在使用UNIQUE鍵而不是NORMAL鍵的速度方面,mysql具有相同的效果?
- 30. MySQL - 也使用外鍵作爲主鍵
在這種情況下,您仍然可以創建外鍵。 Mysql甚至不需要對父列 – a1ex07 2011-05-30 19:44:47