[英]Multiple Column Index vs Multiple Indexes
我在MySQL數據庫中有下表:
CREATE TABLE `secondary_images` (
`imgId` int(10) unsigned NOT NULL AUTO_INCREMENT,
`primaryId` int(10) unsigned DEFAULT NULL,
`view` varchar(255) DEFAULT NULL,
`imgURL` varchar(255) DEFAULT NULL,
`imgDate` datetime DEFAULT NULL,
PRIMARY KEY (`imgId`),
KEY `primaryId` (`primaryId`),
KEY `imgDate` (`imgDate`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ;
SQL將如下所示:
SELECT imgURL, view FROM secondary_images
WHERE primaryId={$imgId} ORDER BY imgDate DESC
正如你可以看到我做了兩個primaryId
和imgDate
,索引鍵。 我背后的想法是因為WHERE
子句的查詢結果使用primaryId
和ORDER
子句使用imgDate
。
我的問題是,現在使用多索引會更好嗎? 還是我應該使用多列索引(目前我不太了解)?
這是我從EXPLAIN得到的:
id = 1
select_type = simple
table = secondary_images
type = ref
possible_keys = primaryId
key = primaryId
key_len = 5
ref = const
rows = 1
extra = Using where; Using filesort
注意:這不是使用多列索引,這是使用上表說明的結果。
您應該在(primaryId,imgDate)上使用多列索引,以便MySQL能夠使用它來選擇行和排序。
如果用於排序的所有列都不在用於選擇的索引中,則MySQL使用“ filesort ”策略,該策略包括對所有行進行排序(如果行太多,則在內存中;否則在磁盤上)。
如果用於排序的所有列都在索引中,則MySQL使用索引來獲取行順序(有一些限制)。
MySQL對索引使用樹結構。 這允許直接訪問鍵而無需排序。
多列索引基本上是列級聯的索引。 這樣,MySQL可以找到與primaryId={$imgId}
匹配的第一行,然后以正確的順序直接訪問所有其他行。
隨着對單排索引primaryId
,MySQL能夠找到相匹配的所有行primaryId={$imgId}
但它會發現在沒有特定的順序行; 因此,之后必須對其進行排序。
您的解釋如下:
[id] => 1
[select_type] => SIMPLE
[table] => secondary_images
[type] => ref
[possible_keys] => primaryId
[key] => primaryId
[key_len] => 5
[ref] => const
[rows] => 1
[Extra] => Using where; Using filesort
讓我們來看一看。
[id] => 1
意味着我們正在談論第一個表。 您僅在語句中調用一個表。
[select_type] => SIMPLE
我們正在做一個簡單的選擇。
[table] => secondary_images
有問題的表名。
[type] => ref
選擇類型,對於聯接最重要。
[possible_keys] => primaryId
這是一個重要的字段 :它顯示哪些鍵可以用來幫助查詢更快地執行。 在這種情況下,只有主鍵才有用。
[key] => primaryId
這是一個重要的領域 :它顯示了最終使用了哪些密鑰。 在這種情況下,為主鍵。
[key_len] => 5
[ref] => const
[rows] => 1
猜測查詢檢查的行數。
[Extra] => Using where; Using filesort
最重要的領域恕我直言。 -使用位置:您正在使用位置語句。 好的 -使用文件排序:查詢的結果太大,無法在內存中排序。 MySQL必須將其寫入文件,對文件進行排序,然后輸出。 這意味着磁盤訪問,並且將減慢一切。 添加有助於排序的索引通常會有所幫助,但是解決“使用文件排序”本身就是一章。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.