MySQL的主鍵和欄位型別問題總結
主鍵問題:
Innodb的索引檔案本身就是資料檔案,即B+Tree的資料域儲存的就是實際的資料,這種索引就是聚集索引。這個索引的key就是資料表的主鍵,因此InnoDB表資料檔案本身就是主索引。
InnoDB的輔助索引資料域儲存的也是相應記錄主鍵的值而不是地址,所以當以輔助索引查詢時,會先根據輔助索引找到主鍵,再根據主鍵索引找到實際的資料。所以Innodb不建議使用過長的主鍵,否則會使輔助索引變得過大。建議使用自增的欄位作為主鍵,這樣B+Tree的每一個結點都會被順序的填滿,而不會頻繁的分裂調整,會有效的提升插入資料的效率。
欄位型別問題:
mysql是基於行的資料庫,而資料讀取則是基於page的。每個page中存放有行。如果每一行的資料量都減小,那麼每個page裡面存放的行就增多了。每次io就能偶取出更多的行。
數字型別:萬不得已,不要用double型別。除了佔用空間比較大之外,還有精度問題。同樣,固定精度的小數也不要使用decimal,建議乘以固定倍數,轉換成整數進行儲存。可以節省儲存空間,而且不用任何附加維護成本。對於整數的儲存,建議分開tinyint/int/bigint,他們儲存資料佔用空間有一定差距。
字元型別:首選char型別,其次varchar,萬不得已,不要用text型別。它的處理效率低於char和varchar。varchar切不可以隨意給一個很大的長度。
時間型別:儘量使用timestamp。儲存空間佔用只是datetime型別的一半。對於需要精確到某一天的型別,建議使用date型別。因為它儲存需要三個位元組。比timestamp還少。不建議使用int來儲存一個unix timestamp,不直觀,不會帶來任何好處。
Innodb的索引檔案本身就是資料檔案,即B+Tree的資料域儲存的就是實際的資料,這種索引就是聚集索引。這個索引的key就是資料表的主鍵,因此InnoDB表資料檔案本身就是主索引。
InnoDB的輔助索引資料域儲存的也是相應記錄主鍵的值而不是地址,所以當以輔助索引查詢時,會先根據輔助索引找到主鍵,再根據主鍵索引找到實際的資料。所以Innodb不建議使用過長的主鍵,否則會使輔助索引變得過大。建議使用自增的欄位作為主鍵,這樣B+Tree的每一個結點都會被順序的填滿,而不會頻繁的分裂調整,會有效的提升插入資料的效率。
欄位型別問題:
mysql是基於行的資料庫,而資料讀取則是基於page的。每個page中存放有行。如果每一行的資料量都減小,那麼每個page裡面存放的行就增多了。每次io就能偶取出更多的行。
數字型別:萬不得已,不要用double型別。除了佔用空間比較大之外,還有精度問題。同樣,固定精度的小數也不要使用decimal,建議乘以固定倍數,轉換成整數進行儲存。可以節省儲存空間,而且不用任何附加維護成本。對於整數的儲存,建議分開tinyint/int/bigint,他們儲存資料佔用空間有一定差距。
字元型別:首選char型別,其次varchar,萬不得已,不要用text型別。它的處理效率低於char和varchar。varchar切不可以隨意給一個很大的長度。
時間型別:儘量使用timestamp。儲存空間佔用只是datetime型別的一半。對於需要精確到某一天的型別,建議使用date型別。因為它儲存需要三個位元組。比timestamp還少。不建議使用int來儲存一個unix timestamp,不直觀,不會帶來任何好處。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15498/viewspace-2139665/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MSSQL資料庫的欄位型別總結SQL資料庫型別
- MySQL修改資料型別的問題總結MySql資料型別
- MySQL欄位型別最全解析MySql型別
- MySQL欄位型別小記MySql型別
- mysql表操作(alter)/mysql欄位型別MySql型別
- MySQL欄位新增註釋,但不改變欄位的型別MySql型別
- MySQL 大欄位問題MySql
- [轉]MySQL 欄位型別參考MySql型別
- sql語句修改欄位型別和增加欄位SQL型別
- MySQL中TEXT與BLOB欄位型別的區別MySql型別
- oracle的欄位型別Oracle型別
- PHP 操作 mysql blob 資料型別的欄位PHPMySql資料型別
- PHP弱型別安全問題總結PHP型別
- [提問交流]建立模型,新增屬性,欄位型別如何設定2位小數的欄位型別模型型別
- 圖解MySQL:count(*) 、count(1) 、count(主鍵欄位)、count(欄位)哪個效能最好?圖解MySql
- 保留兩位小數:資料庫欄位型別NUMBER,Java欄位型別Double型別資料庫型別Java
- MySQL null值欄位是否使用索引的總結MySqlNull索引
- MySQL中NULL欄位的比較問題MySqlNull
- Oracle 修改欄位型別和長度Oracle型別
- 物件型介面 / 定製操作型別和欄位物件型別
- 修改表的欄位型別型別
- 根據時間欄位匯入資料的問題總結
- MongoDB更改欄位型別MongoDB型別
- varchar or blob:欄位型別的儲存和溢位條件型別
- 關於mysql中欄位定義的型別int、tinyint區別MySql型別
- MYSQL SET型別欄位的SQL操作知識介紹MySql型別
- impdp匯入包含xmltype型別欄位空表報錯問題XML型別
- Mysql支援的資料型別(總結)MySql資料型別
- MongoDB中的欄位型別IdMongoDB型別
- oracle 修改欄位型別的方法Oracle型別
- MySQL和Oracle的新增欄位的處理差別MySqlOracle
- impdp匯入XMLTYPE欄位型別的資料出現亂碼的問題XML型別
- Mysql關於自增主鍵,自增主鍵優化總結MySql優化
- MySQL VARCHAR型別欄位到底可以定義多長MySql型別
- mysql-欄位設定Default值問題MySql
- ORACLE MYSQL中join 欄位型別不同索引失效的情況OracleMySql型別索引
- 在SQL Server中修改欄位型別和欄位名稱的儲存過程SQLServer型別儲存過程
- MySQL自增主鍵跳號問題MySql