mysql 多列索引优化

Mysql所有的列都可以使用索引,。对相关列使用索引是提高SELECT操作性能的最佳途径。根据存储引擎定义每个表的最大索引数和最大索引长度。所有存储引擎支持每个表至少16个索引,总索引长度至少256字节。在索引中使用col_name(length)语法,可以创建一个只使用char和archar列的第一个length个字符的索引,按这种方式只索引列的前缀可以索引文件小的多。MyISAm和INNODb存储引擎还支持对blob和text列的索引,但是必须指定索引长度。fulltext索引用于全文搜索不支持局部索引。

 

多列索引:

     Mysql可以创建多列索引,一个索引支持15个列,多列索引对于多条件查询很有帮助。多列索引可以看做是通过连接索引列的值而创建的值的排序的数组。

    Mysql按这样的方式使用多列索引:当在WHERE子句为索引的第一个列指定已知的数量时查询很快,即使没有指定其他列的值。

  CREATE INDEX suoyin ON Table (col1,col2)

suoyin索引是对于col1和col2的索引,索引可以用于col1,或者是col1,col2在已知范围指定值的查询。

  select * FROM test where col1=‘where‘;

select * from test where col1=‘where1‘ AND col2="where2";

select * from test where col1=‘where1‘ AND (col2=‘where1‘ OR col2=‘where3‘);

select * from test where col1=‘where1‘ AND col2 >=‘where1‘ AND col2 < ‘where3‘;

但是多列索引不用与下边的查询:

   select * from test WHERE col2 = ‘where‘;

select * from test where col1=‘where1‘ OR col2 = ‘where3‘;

 

mysql 如何使用索引:

    索引用于快速找出在某一个列中有一特定值的行。不使用索引,mysql必须从第一条记录开始然后读完整个表直到找出相关的行,表越大,花费的时间越大。如果表中查询的列有索引,Mysql不必查看所有的数据,快速达到一个位置去搜索数据。大多数mysql索引在B树中存储。。

索引用于下面的操作

  快速找出匹配一个WHERE子句的行。

删除时。

执行联接查询从其它表检索时

对具体的有索引的列找出max,min。

对一个可用关键字进行排序分组。

当使用

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

如果表有一个多列索引,优化器可以使用最左面的索引前缀来找出行。例如,如果有一个3列索引(col1,col2,col3),则已经对(col1)、(col1,col2)和(col1,col2,col3)上的搜索进行了索引
如果列不构成索引最左面的前缀,mysql不能使用局部索引。index(col1,col2,col3)

select * from table where col1=val1;

select * from table where col1=val1 AND col2=val2;

select * froom table where col2=val2;不使用索引

select * from table where col2=val2 and col3=val3; 不实用索引

SELECT * FROM Table WHERE col1=val1 OR col2=val2; 不实用索引。

也可以在表达式通过=、>、>=、<、<=或者BETWEEN操作符使用B-树索引进行列比较。如果LIKE的参数是一个不以通配符开头的常量字符串,索引也可以用于LIKE比较。

 like ‘partten%‘;使用索引

like ‘parrtn%sf%‘; 使用索引

like ‘%parrtn‘;不实用索引,因为以%开头使用不了索引值的前缀。

like other_col 不使用索引因为不是一个常量值。

如果列是被索引的,那么 col_name is NULL 的搜索也会使用索引。

任何不跨越 WHERE子句中的所有 AND级的索引不用于优化查询,也就是为了能够使用索引,必须在每个AND组中使用所有索引的前缀。

下边的使用索引:

  where index_part1 = val1 AND index_part2=val2;

where index1=val1 OR index2=val2 AND index3=val3;这里的列都是索引前缀或是单列索引。

下边的不实用索引:

  where index_part2 = val2 AND|OR index_part3=val3;没使用索引前缀。

where index-part1 =val1 OR index_part2=val2;没有索引跨越所有行

wher index_part1 AND a=‘A‘ 索引中不使用WHERE子句的两部分

Hash索引还有一些其它特征:

  它们只用于使用=或<=>操作符的等式比较(但很快)。它们用于比较 操作符,例如发现范围值的<。

优化器不能使用hash索引来加速ORDER BY操作

MySQL不能确定在两个值之间大约有多少行(这被范围优化器用来确定使用哪个索引)。如果你将一个MyISAM表改为hash-索引的MEMORY表,会影响一些查询

只能使用整个关键字来搜索一行。(用B-树索引,任何关键字的最左面的前缀可用来找到行

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。