2013-11-28 91 views
9

我正在學習MySQL索引,發現索引應該應用於SELECT查詢的WHERE子句中指定的任何列。MySQL初學者 - 多列索引

然後我發現Multiple Column Index vs Multiple Indexes

首先Q,我想知道什麼是多列索引。我發現來自Joomla的代碼,這是多列索引?

CREATE TABLE `extensions` (
    `extension_id` INT(11) NOT NULL AUTO_INCREMENT, 
    `name` VARCHAR(100) NOT NULL, 
    `type` VARCHAR(20) NOT NULL, 
    `element` VARCHAR(100) NOT NULL, 
    `folder` VARCHAR(100) NOT NULL, 
    `client_id` TINYINT(3) NOT NULL, 
    ... ... 
    PRIMARY KEY (`extension_id`), 

    // does code below is multiple column index? 

    INDEX `element_clientid` (`element`, `client_id`), 
    INDEX `element_folder_clientid` (`element`, `folder`, `client_id`), 
    INDEX `extension` (`type`, `element`, `folder`, `client_id`) 
) 

第二個問題,我是否正確如果認爲在一個SELECT上使用了一個多列索引?拇指索引的

SELECT column_x WHERE element=y AND clinet_id=y; // index: element_clientid 

SELECT ex.col_a, tb.col_b 
    FROM extensions ex 
    LEFT JOIN table2 tb 
    ON (ex.ext_id = tb.ext_id) 
    WHERE ex.element=x AND ex.folder=y AND ex.client_id=z; // index: element_folder_clientid 

回答

20

一般的規則是一個巴掌在上一個WHEREJOIN子句中使用的任何領域。

這就是說,你可以做一些優化。如果你知道某個字段的組合是唯一一個將在WHERE中在特定表中使用的字段,那麼你可以在這些字段上創建一個單一的多字段密鑰,例如。

INDEX (field1, field2, field5) 

v.s.

INDEX (field1), 
INDEX (field2), 
INDEX (field5) 

多字段索引在許多情況下可以更有效,因爲v.s必須掃描多個索引。缺點是多字段索引只有在有問題的字段實際在WHERE子句中使用時纔可用。

由於您的示例查詢,因爲elementfield_id都在三個索引中,所以最好將它們拆分爲它們自己的專用索引。如果這些是可改變的領域,那麼最好保留它們自己的專用索引。例如如果您必須批量更改field_id,則數據庫必須更新3個不同的索引,v.s.只更新一個專用的。

但這一切都歸結爲基準測試 - 用各種索引設置測試您的特定設置,並查看哪個性能最好。經驗法則是方便的,但不能100%的時間工作。

+0

是的,我做了一些基於field1的測試排序和其他領域自動索引。但我不確定是否獨立分割元素和field_id。 – qaharmdz