key中文 - MySQL中INDEX,PRIMARY,UNIQUE,FULLTEXT之間的區別?




unique key中文 (2)

差異

  • KEYINDEX是指一個正常的非唯一索引。 索引的非重疊值是允許的,因此索引可能包含索引所有列中具有相同值的行。 這些索引不會對您的數據實施任何限制,因此它們僅用於確保某些查詢可以快速運行。

  • UNIQUE指索引中所有行必須唯一的索引。 也就是說,對於此索引中的所有列,同一行可能不具有與另一行相同的非NULL值。 除了用於加快查詢速度外,UNIQUE索引還可用於強制限制數據,因為數據庫系統不允許在插入或更新數據時破壞此不同值規則。

    您的數據庫系統可能允許將UNIQUE索引應用於允許NULL值的列,在這種情況下,如果兩行都包含NULL值(這裡的基本原理是NULL被認為不等於自身),則允許兩行相同。 但是,根據您的應用程序,您可能會發現這種情況不合需要:如果您希望防止這種情況發生,您應該在相關列中禁止使用NULL值。

  • PRIMARY的行為與UNIQUE索引完全相同,除了它總是被命名為“PRIMARY”,並且在表上可能只有一個(並且總是應該有一個;儘管一些數據庫系統不強制執行此操作)。 PRIMARY索引是作為唯一標識表中任何行的主要手段,因此與UNIQUE不同,它不應用於任何允許NULL值的列。 您的PRIMARY索引應該位於足以唯一標識一行的最小列數上。 通常,這只是一列包含一個唯一的自動遞增數字,但如果還有其他任何可以唯一標識一行的列(如國家/地區列表中的“countrycode”),則可以使用該列。

    一些數據庫系統(例如MySQL的InnoDB)將按照它們出現在PRIMARY索引中的順序將一張表的記錄存儲在磁盤上。

  • FULLTEXT索引與以上所有不同,它們的行為在數據庫系統之間有很大不同。 FULLTEXT索引僅用於使用MATCH()/ AGAINST()子句完成的全文搜索,與上述三種不同 - 通常在內部使用b-樹實現(允許從最左列開始選擇,排序或範圍)或哈希表(允許從最左列開始選擇)。

    在其他索引類型是通用目的的情況下,FULLTEXT索引是專用的,因為它具有狹義的目的:它僅用於“全文搜索”功能。

相似

  • 所有這些索引可能有多個列。

  • 除FULLTEXT外,列順序非常重要:為使索引在查詢中有用,查詢必須使用索引中從左側開始的列 - 它不能僅使用索引的第二,第三或第四部分索引,除非它也使用索引中的前幾列來匹配靜態值。 (要使FULLTEXT索引對查詢有用,查詢必須使用索引的所有列。)

創建MySQL表時,PRIMARY,UNIQUE,INDEX和FULLTEXT之間有什麼區別?

我將如何使用它們?


我覺得這已經被很好的覆蓋了,可能除了以下幾點:

  • 如果選擇性足夠,簡單的KEY / INDEX (或稱為SECONDARY INDEX )可以提高性能。 在這個問題上,通常的建議是,如果應用索引的結果集中的記錄數量超過父表記錄總數的20%,那麼索引將無效。 在實踐中,每個架構都會有所不同,但這個想法仍然是正確的。

  • 二級索引(並且這對於mysql非常具體)不應該被視為與主鍵完全分離和不同的對象。 實際上,兩者都應該聯合使用,並且一旦知道這些信息,就可以為mysql DBA提供額外的工具:在Mysql中,索引嵌入主鍵。 它可以顯著提高性能,尤其是在巧妙構建隱含覆蓋索引( 如上所述)時

  • 如果您覺得您的數據應該是UNIQUE ,請使用唯一的索引。 您可能認為它是可選的(例如,在應用程序級別進行處理),並且正常的索引會執行,但它實際上代表了對每一行都是唯一的Mysql的保證,這偶然提供了性能優勢。

  • 您只能使用Innodb(在MySQL 5.6.4及更高版本中)和Myisam引擎的FULLTEXT (或稱為SEARCH INDEX

  • 您只能在CHARVARCHARTEXT列類型上使用FULLTEXT
  • FULLTEXT索引涉及的不僅僅是創建索引。 有一堆創建的系統表,一個完全獨立的緩存系統以及一些特定的規則和優化應用。 請參閱http://dev.mysql.com/doc/refman/5.7/en/fulltext-restrictions.htmlhttp://dev.mysql.com/doc/refman/5.7/en/innodb-fulltext-index.html






schema