2013-11-28 53 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