程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 有關MySQL InnoDB在索引中自動添加主鍵的問題

有關MySQL InnoDB在索引中自動添加主鍵的問題

編輯:MySQL綜合教程

有關MySQL InnoDB在索引中自動添加主鍵的問題    ㈠ 原理:           只要用戶定義的索引字段中包含了主鍵中的字段、那麼這個字段就不會再被InnoDB自動加到索引中       但如果用戶的索引字段中沒有完全包含主鍵字段、InnoDB 就會把剩下的主鍵字段加到索引末尾        ㈡ 例子           例子一:   [sql]  CREATE TABLE t (     a char(32) not null primary key,     b char(32) not null,     KEY idx1 (a,b),     KEY idx2 (b,a)   ) Engine=InnoDB;           idx1 和 idx2 兩個索引內部大小完全一樣、沒有區別           例子二:   [sql]  CREATE TABLE t (     a char(32) not null,     b char(32) not null,     c char(32) not null,     d char(32) not null,     PRIMARY KEY (a,b)     KEY idx1 (c,a),     KEY idx2 (d,b)   ) Engine=InnoDB;          這個表 InnoDB 會自動補全主鍵字典、idx1 實際上內部存儲為 (c,a,b),idx2 實際上內部存儲為 (d,b,a)    但是這個自動添加的字段、Server 層是不知道的、所以 MySQL 優化器並不知道這個字段的存在、那麼如果你有一個查詢:     [sql]  SELECT * FROM t WHERE d=x1 AND b=x2 ORDER BY a;            其實內部存儲的 idx2(d,b,a) 可以讓這個查詢完全走索引、但是由於 Server 層不知道、    所以最終 MySQL優化器 可能選擇 idx2(d,b) 做過濾然後排序 a 字段、或者直接用PK掃描避免排序        而如果我們定義表結構的時候就定義為 KEY idx2(d,b,a) 、那麼 MySQL 就知道(d,b,a)三個字段索引中都有、    並且 InnoDB 發現用戶定義的索引中包含了所有的主鍵字段、也不會再添加了、並沒有增加存儲空間        ㈢ 建議        因此、由衷的建議、所有的 MySQL DBA 建索引的時候、都在業務要求的索引字段後面補上主鍵字段、    這沒有任何損失、但是可能給你帶來意外的驚喜哦

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