在哪些情況下,我應該爲多列創建一個索引,而不是爲每列創建單獨的索引?在哪些情況下,我應該爲多個列創建一個索引,而不是爲每個列創建單獨的索引?
1
A
回答
2
如果您查詢的條件包含多列。如果您將所有列形式條件添加到索引。你會加速執行。使用EXPLAIN
命令在添加索引之前和之後檢查執行計劃。當然,不要添加太多列,尤其是不同類型的列,因爲添加索引可能沒有好處。
0
綜合指數將有助於大多數情況。如果你有一個像下面那樣的桌子。
請考慮下表。
用戶
+-----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| ID | int(11) | YES | | NULL | |
| USER | varchar(100) | YES | | NULL | |
| EMAIL_ID | varchar(200) | YES | | NULL | |
| MODE | varchar(50) | YES | | NULL | |
| TIMESTAMP | bigint(20) | YES | | NULL | |
+-----------+--------------+------+-----+---------+-------+
在這個表中,我們審覈像 '簽到', 'SIGNUP', '關閉' 用戶操作。在這種情況下,我們希望從此表中更快地獲得詳細信息。但是這將有數百萬條目。
值在我的表中。
select * from Users;
+------+----------+-----------------------+--------+---------------+
| ID | USER | EMAIL_ID | MODE | TIMESTAMP |
+------+----------+-----------------------+--------+---------------+
| 1 | kannan | [email protected] | SIGNIN | 1353864896000 |
| 2 | bharathi | bharathikannan.r | SIGNUP | 1353864934000 |
| 2 | mack | [email protected] | SIGNIN | 1353865121000 |
| 2 | david | [email protected] | SIGNIN | 1353865130000 |
+------+----------+-----------------------+--------+---------------+
查詢:
select EMAIL_ID from Users where TIMESTAMP > 1353864896000;
explain輸出:
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | Users | ALL | NULL | NULL | NULL | NULL | 4 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
看解釋輸出
它檢查表中的整行。因爲這個查詢不是作爲range
之一執行的。我們要爲TIMESTAMP
列創建索引。
在爲時間戳列創建的索引之後解釋輸出。
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | Users | ALL | t_dx | NULL | NULL | NULL | 4 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
它仍然不作爲範圍查詢執行。因爲我們只索引TIMESTAMP
列。我們希望創建一個組合索引TIMESTAMP,EMAIL_ID
以執行此查詢作爲範圍一。
create index t_dx on Users(TIMESTAMP,EMAIL_ID);
在創建組合索引後解釋輸出。
+----+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+
| 1 | SIMPLE | Users | range | t_dx | t_dx | 9 | NULL | 3 | Using where; Using index |
+----+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+
現在,它執行範圍查詢並查看所檢查的行數,它只在給定時間條件之上進行掃描。組合索引將有助於大型表格。
0
它不一定是一個任何一種情況。假設你有訂單表:
orderid integer,
orderdate date,
etc...
和的OrderDetail表
orderid integer,
lineno integer,
productID integer,
etc...
,因爲你要做上查找所有的時間你可能會在orderdetail.orderid
想索引和DBMS將用它來驗證你的外鍵查詢的參照完整性,返回到orders
。然而,你可能會風做了很多選擇,看起來像的:
select *
from orderdetail
where orderid=?
order by lineno
在這種情況下,orderdetail.orderid,orderdetail.lineno
指數將是有益的。
相關問題
- 1. 在每組列上創建索引或爲每列創建單獨的索引,哪個更好?
- 2. 我應該在這些列上創建一個索引嗎?
- 3. 有沒有更好的方法來索引多列而不是爲每個排列創建一個索引?
- 4. 是否可以爲多個列創建一個索引? hiberanate
- 5. 在其列,我應該創建索引
- 6. 我應該使用多個單列索引還是單個多列索引?
- 7. 我應該爲每個外鍵創建索引嗎?
- 8. mongodb:爲嵌套文檔創建一個頂級索引,而不必索引每個單獨的子級別?
- 9. 爲每個索引創建一個包含多個數據條目的列表
- 10. SQL在一個表上創建多列索引和單列索引
- 11. 我應該在哪一列創建索引?
- 12. 創建一個列的索引Vs的上聚類列創建索引
- 13. 在哪些情況下Oracle會自動創建索引?
- 14. 我應該爲此創建索引嗎?
- 15. 創建一個jQuery索引來遍歷單獨的列表
- 16. 應該創建多個文檔類型還是多個索引?
- 17. 創建一個動態列表索引
- 18. 應該爲更快的查詢創建多少個索引
- 19. 創建索引列
- 20. 在一個一對多的關係上創建列索引
- 21. 我應該索引哪些列?
- 22. 我應該爲每個WPF窗口創建單獨的Bootstrapper嗎?
- 23. 我應該爲每個類別創建單獨的表嗎?
- 24. 一個班輪:從索引列表創建詞典作爲鍵
- 25. 默認情況下,hibernate是否在表創建時添加一個索引(mysql)
- 26. MySQL索引性能...我應該在這個簡單的表上創建一個索引嗎?
- 27. 使用單個下拉列表創建索引
- 28. 應該爲這個MySQL查詢創建什麼索引
- 29. 我應該索引已經是複合索引一部分的單個列嗎?
- 30. 我是否應該通過UNIQUE列創建索引?