MySQL初学者 - 多列索引

 激越工作室 发布于 2023-02-13 22:09

我正在学习MySQL索引,发现索引应该应用于SELECT查询的WHERE子句中指定的任何列.

然后我找到了多列索引与多个索引.

首先,我想知道什么是多列索引.我找到了来自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

Marc B.. 22

索引的一般经验法则是将一个打到一个WHEREJOIN子句中使用的任何字段.

话虽这么说,你可以做一些优化.如果您知道某个字段组合是唯一一个将在特定表的WHERE中使用的字段,那么您可以在这些字段上创建单个多字段键,例如

INDEX (field1, field2, field5)

VS

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

在许多情况下,多字段索引可以更高效,而不必扫描多个索引.缺点是多字段索引仅在有问题的字段实际用于WHERE子句时才可用.

使用示例查询,从element而且field_id在所有三个索引中,您可能最好将它们拆分为自己的专用索引.如果这些是可更改的字段,那么最好将它保留为自己的专用索引.例如,如果您必须进行field_id批量更改,则数据库必须更新3个不同的索引,而不仅仅更新一个专用索引.

但这一切都归结为基准测试 - 使用各种索引设置测试您的特定设置,并查看哪个性能最佳.拇指规则很方便,但100%的时间都不起作用.

1 个回答
  • 索引的一般经验法则是将一个打到一个WHEREJOIN子句中使用的任何字段.

    话虽这么说,你可以做一些优化.如果您知道某个字段组合是唯一一个将在特定表的WHERE中使用的字段,那么您可以在这些字段上创建单个多字段键,例如

    INDEX (field1, field2, field5)
    

    VS

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

    在许多情况下,多字段索引可以更高效,而不必扫描多个索引.缺点是多字段索引仅在有问题的字段实际用于WHERE子句时才可用.

    使用示例查询,从element而且field_id在所有三个索引中,您可能最好将它们拆分为自己的专用索引.如果这些是可更改的字段,那么最好将它保留为自己的专用索引.例如,如果您必须进行field_id批量更改,则数据库必须更新3个不同的索引,而不仅仅更新一个专用索引.

    但这一切都归结为基准测试 - 使用各种索引设置测试您的特定设置,并查看哪个性能最佳.拇指规则很方便,但100%的时间都不起作用.

    2023-02-13 22:21 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有