• 8.3.5 Multiple-Column Indexes 多列索引


    8.3.5 Multiple-Column Indexes 多列索引

    MySQL 可以创建符合索引(索引在多列上),一个索引可以包含多大16个列,对于某些数据类型,你可以索引一个前缀列。

    MySQL 可以使用多列索引用于查询,测试所有的列在索引里,或者 查询只测试第一列,头2列,头3列。

    如果你指定 了正确的顺序在索引定义的时候,一个简单的符合索引能加速若干查询。

    一个多列索引 被认为是一个已排序的数组, 索引中包含值的行

    注意:

    作为一个复合索引,你可以介绍基于其他列的被hash的列。如果这个列是短的,合理的唯一的,可以被索引的,

    可能比宽的在很多列上的索引更快。 在Mysql, 这是很容易使用这个额外的列:

    SELECT * FROM tbl_name
    WHERE hash_col=MD5(CONCAT(val1,val2))
    AND col1=val1 AND col2=val2;

    假设一个表有下面的规则:

    CREATE TABLE test (
    id INT NOT NULL,
    last_name CHAR(30) NOT NULL,
    first_name CHAR(30) NOT NULL,
    PRIMARY KEY (id),
    INDEX name (last_name,first_name)
    );

    name 索引是在last_name和first_name 列,该指标可用于查找查询指定值在已知范围内组合last_name和first_name值。

    它也可以用于特定的last_name值的查询,因为last_name列是索引最左边前缀。

    因此, name index 适用于下面的查询:
    SELECT * FROM test WHERE last_name=’Widenius’;

    SELECT * FROM test
    WHERE last_name=’Widenius’ AND first_name=’Michael’;

    SELECT * FROM test
    WHERE last_name=’Widenius’
    AND (first_name=’Michael’ OR first_name=’Monty’);

    SELECT * FROM test
    WHERE last_name=’Widenius’
    AND first_name >=’M’ AND first_name < ‘N’;

    name index 不能用于下面的查询:

    SELECT * FROM test WHERE first_name=’Michael’;

    SELECT * FROM test
    WHERE last_name=’Widenius’ OR first_name=’Michael’;

    假设 你执行下面的SELECT 语句:

    SELECT * FROM tbl_name
    WHERE col1=val1 AND col2=val2;

    如果一个多列索引存在col1和col2上, 相应的记录可以直接取得。 如果一个单独的 单列索引在col1和col2,

    优化器尝试使用index merge 优化,或者尝试找到最限定的索引通过确定哪个索引排除最多的行。

    如果表中有多个列的索引,索引的最左前缀能用于通过优化器来查找记录。比如,

    如果你有一个3列索引在(col1, col2, col3), 你可以通过索引搜索在 (col1), (col1, col2), and (col1, col2, col3).

    MySQL 无法使用索引来执行查找 ,如果列不构成索引的最左前缀进行查找,假定您有此处显示的选择语句:

    SELECT * FROM tbl_name WHERE col1=val1;
    SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;

    SELECT * FROM tbl_name WHERE col2=val2;
    SELECT * FROM tbl_name WHERE col2=val2 AND col3=val3;

    如果一个index 存在于(col1, col2, col3), 只有前2个能使用索引, 第三个和第四个查询

    确实涉及了索引列,但是t (col2) and (col2, col3) 不是索引的最左边列。

  • 相关阅读:
    pycharm快捷键
    Docker
    Go语言与Elasticsearch
    Celery与APScheduler
    爬虫入门到入狱
    数据分析
    后台管理
    Linux基础与自动化运维
    微信小程序
    Git
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13351423.html
Copyright © 2020-2023  润新知