mysql5.7官网直译优化和索引--多列索引

来源:互联网 发布:cc攻击 linux 编辑:程序博客网 时间:2024/06/05 10:45
8.3.5 Multiple-Column indexes 多列索引。
mysql能够创建一个综合索引(也就是,索引在多个列上)。一个索引最多可以由16列组成。对于确定的数据类型,你能够索引一个列的前缀(具体请看8.3.4的索引列)。
mysql能够使用多列索引在查询中判断出现在索引中的所有列,或者是查询只判断第一列,第一二列,第一到三列,等等。如果你定义了特别的列顺序在索引中,那么一个简单的综合索引能够帮助你提高在同一张表中的多种查询。
一个多列索引可以被认为是一个有序数组,有值的行数据通过联系被索引的列的值而创建。
  注意:
  作为一个备选对组合索引,你能够提出一个列,该列是基于其他列信息的哈希。如果这列是合理的,短小的,唯一的,被索引的,它的速度回比一个宽索引在多个列上更快。在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值的查询,因为该列是索引的最左前列(这部分之后会描述)。因此,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上,优化器器会试着使用索引合并优化(具体看8.2.1.3的索引优化合并),或者是尝试找到最严肃索引来决定哪一个索引包含更多的行并使用索引查找行数据。
如果表有一个多列索引,任何左前缀索引都能够被优化器用来查找行。例如,如果你有一个三列索引在(col1,col2,col3),你能够索引查询在(col1),(col1,col2)和(col1,col2,col3).
mysql不能使用索引来优化查询,如果查询列不是一个索引左前缀的形式的话。假设你有查询语句如下:
ELECT * 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;
如果一个索引存在(col1,col2,col3),只有第一二个查询能够使用索引。第三和第四查询确实涉及到了索引列,但是因为(col2)和(col2,col3)不是索引(col1,col2,col3)的左前缀,素银不能使用索引。
到此关于多列索引的使用就结束了,接下来我们要说的是8.3.6Verifying Index Usage
------------------------------------
8.3.6Verifying Index Usage 检验索引的使用
检查你的全部查询是否使用了你在表中创建的索引,使用EXPLAIN语句,具体描述在8.8.1的使用EXPLAIN来优化查询。
阅读全文
0 0
原创粉丝点击