zoukankan      html  css  js  c++  java
  • 8.3.5 Multiple-Column Indexes 多列索引:

    8.3.5 Multiple-Column Indexes 多列索引:

    MySQL 可以创建符合索引(即,索引在多列上).

    一个索引可能有最多16列组成,对于某些数据类型,你可以索引一个列的前缀。

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

    如果你指定列按正确的顺序在索引定义里,一个单独额复合索引能加速几种类型的查询。

    多列索引可以被认为是一个排序的数组, 索引的记录包含索引列的值。

    注意:

    作为一个非传统的对于一个复杂索引,你可以介绍一个列是hash的基于其他列的信息。

    如果这个列是短的,合理的独特的,被索引的,它可能比一个wide索引在很多列上快。

    在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和forst_name 组合索引, 这个索引可以用于在查询里查找,

    查找特定的值在一个已知的range用于包含last_name和first_name 值。

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

    因此,索引name 是用于查找下面的查询:

    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 不能用于下面的查询:

    SELECT * FROM test WHERE first_name=’Michael’;

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

    假设你执行下面的查询:

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

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

    如果单独的 单列索引存在col1和col2,优化器尝试使用Index Merge optimization (see Section 8.2.1.4, “Index Merge

    Optimization”),

    或者尝试找到最严格的索引通过决定 那个索引能排除更多的行,
    使用index 来获取行

    如果表有一个多列索引,任何的最左前缀的索引可以用于优化查询记录。

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

    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;

  • 相关阅读:
    接着上回,导包正确之后,出现javabean.Friend cannot be cast to java.util.List,的错误。找了很久。以为是User user0作为参数,改成了String username还是错误,看了看listFriend.jsp没有错误,我想会不会是包多了,导致类型复杂。最后发现包少了一个:
    c语言
    软链接和硬链接的联系和区别
    centos7怎么永久修改hosname
    虚拟机静态ip设置
    Centos、Ubuntu开启命令模式
    Kubernetes重要概念理解
    人生道路上,永远没有“容易”二字
    知识【英文】
    模板【kruskal重构树】
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13351267.html
Copyright © 2011-2022 走看看