程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> Schema的優化和索引:主鍵的選擇

Schema的優化和索引:主鍵的選擇

編輯:關於MYSQL數據庫

對於主鍵,選擇一個好的數據類型尤為關鍵。你可能經常需要用這些列和其他做比較以及用這些列查找其他的列。你可能也把它們作為另一些表的外鍵。因此當你選擇主鍵的數據類型時,應該保持相關表主鍵類型一致。

  當選擇主鍵的數據類型,你不僅要考慮存儲類型,也要考慮MySQL操作和比較這些類型的表現情況。比如,MySQL內部存儲ENUM和SET是作為整型的,但是當在字符串環境下作比較的時候,MySQL會把它們轉為字符串。

  一旦你選擇了一個類型,要確定相關表都要使用這個類型。這個類型一定要精確,包括了它的屬性,如UNSIGNED。混合不同的數據類型,會引起性能問題。即使不會,在類型比較的時候,也會出現很難發現的錯誤。在忘記比較不同的數據類型之後,這些錯誤往往會發生。

  根據你需要值的范圍,選擇最小的數據類型的范圍。並且要為以後留一些主鍵增長的空間。一個例子,你使用state_id來存儲美國州的名稱,你不需要上千或百萬的值。因此你不需要使用INT。一個TINYINT就足夠了並且它大小為3字節。如果你使用它作為其他表的外鍵。三字節就能發揮大的作用了。

  Integer類型

  Integer通常來說是主鍵類型的最佳選擇。因為它很快並且可以自增。

  ENUM 以及SET

  通常來說,雖然它們對於表中包含狀態或者類型值比較有用,但對於主鍵並不是一個好的選擇。ENUM和SET比較適合存儲一些如訂單的狀態,產品的類型,或者人的性別。

  如果你使用了ENUM定義了一個產品的類型,你可能要根據唯一的ENUM字段來查找(你可能在這表中添加了產品的描述以及等等產品類型的相關信息)。這種情況下你可能使用ENUM作為主鍵,但是大多數情況要避免使用。

  String類型

  如果可以,要盡可能避免使用String做為主鍵。它會浪費許多空間以及處理起來要慢於Integer。當使用MyISAM的表時,使用String要尤為小心。默認的情況下,MyISAM會對String類型的索引進行壓縮,這樣會使查找變慢。

  你也要小心使用隨機的String.如MD5(),SHA1(),UUID().隨機生成的String散列在大的空間中,這會降低插入和一些查詢語句的速度。

  降低了INSERT語句,因為在索引中這插入的值會存入隨機的位置。這回造成頁的分割,隨機硬盤訪問,造成聚集索引碎片。

  降低SELECT速度,因為相鄰的行被分散在硬盤和內存中。

  隨機值會導致緩存能力的下降。因為它們消除了本地的引用。本地的引用是緩存的工作方式。如果所有的數據都已經“預熱”了,把任意數據放到緩存中沒有任何的優勢並且,如果工作數據集合沒有在內存中,緩存就會有很多刷新和查找丟失的現象。

  如果使用的UUID值,要去掉破折號或者使用UNHEX( )把UUID轉為16字節的數並且,把它們存在BINARY(16)的列。你可使用HEX來獲得16進制的值。

  UUID生成的值和其他哈希函數如SHA1()生成的值有所不同。UUID的值分布不均並且稍微有點連續。但是它還是沒有整型好。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved