我正在学习MySQL索引,发现索引应该应用于SELECT查询的WHERE子句中指定的任何列。
然后我找到了Multiple Column Index vs Multiple Indexes。
首先,我想知道什么是多列索引。我找到了来自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
答案 0 :(得分:21)
索引的一般经验法则是将一个敲击到WHERE
或JOIN
子句中使用的任何字段。
话虽如此,你可以做一些优化。如果您知道某个字段组合是唯一一个将在特定表的WHERE中使用的字段,那么您可以在这些字段上创建单个多字段键,例如
INDEX (field1, field2, field5)
v.s。
INDEX (field1),
INDEX (field2),
INDEX (field5)
在许多情况下,多字段索引可以更高效,v.s必须扫描多个索引。缺点是多字段索引仅在有问题的字段实际用于WHERE子句时才可用。
对于您的示例查询,由于element
和field_id
在所有三个索引中,您可能最好将它们拆分为自己的专用索引。如果这些是可更改的字段,那么最好保留它们自己的专用索引。例如如果您必须批量更改field_id
,则数据库必须更新3个不同的索引,v。只更新一个专用的。
但这一切都归结为基准测试 - 使用各种索引设置测试您的特定设置,并查看哪个性能最佳。拇指规则很方便,但在100%的时间都不起作用。