簡體   English   中英

我們是否應該包括排序列,復合索引的主鍵(MySQL)

[英]Should we include sort column, primary key on composite index (MySQL)

表格(簡體):

+---------------------------------------------------------------------+
| id (Primary AI) |  user_id  |  status  |  type  |   data   |   ip   |
+=====================================================================+
|        1        |     3     |    0     |   abc  |   a-s-d  |    -   |
+---------------------------------------------------------------------+
|        2        |     1     |    0     |   ooo  |   z-z-z  |    -   |
+---------------------------------------------------------------------+
|        3        |     3     |    0     |   ooo  |   f-f-f  |    -   |
+---------------------------------------------------------------------+
|        4        |     2     |    0     |   abc  |   h-h-h  |    -   |
+---------------------------------------------------------------------+
|        5        |     1     |    0     |   abc  |   a-s-d  |    -   |
+---------------------------------------------------------------------+

更多信息:

ID是此表的主鍵(自動遞增)

請注意,我已使用ID (Primary Key)作為新索引上的第三個Seq_in_index

我已經為上述表格創建了一個綜合索引

CREATE INDEX userid_type_id ON table (user_id, type, id);

該索引中的id僅用於排序。

樣品查詢

SELECT id, status, data, ip 
                      FROM `table`
                      WHERE user_id=3 AND type='abc' 
                      ORDER BY id DESC;

我的問題是:

  1. 在復合索引中插入ID是否是一種良好的(性能)做法? 因為它僅用於ORDER BY

  2. 在表的第一列時,可以使用ID(主鍵)作為索引中的第三序列嗎?

  3. 我是否根據樣本查詢正確選擇了索引?

編輯:

我使用InnoDB

答案取決於您使用的引擎:

  • MyISAM-將ID添加到索引可以並且可能會有所幫助
  • InnoDB-主鍵已經是每個輔助索引的一部分,因為innodb將按主鍵排序的行存儲在BTREE中,並且索引需要主鍵指向實際行-在這種情況下,如果它在索引中位於最后,則添加它是多余的(但是這樣做不會將其添加兩次,因此它不會使情況變得更糟)。 在某些情況下,您可能希望將其添加為非最后一個,或者您擁有多列主數據庫,並且以不同的順序向索引添加了一些列-應該沒有問題,innodb會將剩余的主列附加到該索引中,但可以使用之前添加的內容而不進行重復)

所以答案:

  1. 在InnoDB中,這是沒有必要的,在MyISAM中,最好使用實際排序,如果不使用它,添加它只會使索引變大。
  2. 表定義中的列順序和索引中的順序是分開的,所以可以
  3. 是的,該索引看起來確實不錯-但您可以使用EXPLAIN進行檢查,甚至有可能獲得更好的性能-“ 覆蓋索引 ”,但這要付出代價,因此,除非查詢關鍵且性能不佳,否則可能會過高。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM