qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

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

           (一)原理

            只要用戶定義的索引字段中包含了主鍵中的字段,那么這個字段就不會再被InnoDB自動加到索引中。但如果用戶的索引字段中沒有完全包含主鍵字段,InnoDB就會把剩下的主鍵字段加到索引末尾。

            (二)例子

            例子一:

          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兩個索引內部大小完全一樣,沒有區別

            例子二:

          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 優化器并不知道這個字段的存在。那么如果你有一個查詢:

             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建索引的時候都在業務要求的索引字段后面補上主鍵字段。這沒有任何損失,但是可能給你帶來意外的驚喜哦。

          posted on 2013-05-10 09:24 順其自然EVO 閱讀(244) 評論(0)  編輯  收藏 所屬分類: 數據庫

          <2013年5月>
          2829301234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 泾川县| 聂拉木县| 西安市| 泸州市| 永兴县| 布拖县| 隆尧县| 濮阳县| 内江市| 永靖县| 旅游| 屏边| 皮山县| 保定市| 和静县| 泸州市| 巴东县| 吉首市| 大悟县| 阿城市| 金乡县| 安溪县| 长岛县| 长岭县| 策勒县| 亚东县| 郑州市| 明星| 怀集县| 云安县| 柳江县| 永宁县| 凤庆县| 武义县| 红原县| 湄潭县| 宜都市| 高尔夫| 清河县| 内江市| 北碚区|