zoukankan      html  css  js  c++  java
  • 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-树索引,任何关键字的最左面的前缀可用来找到行

  • 相关阅读:
    localStorage、sessionStorage详解,以及storage事件使用
    企业和开发人员究竟该如何适应web标准?
    平面设计常用制作尺寸
    git命令
    TCP/IP、Http、Socket的区别
    canvas
    《千克》
    《小数的加法》
    fiddler设置代理
    《分数的基本性质》
  • 原文地址:https://www.cnblogs.com/phplhs/p/4438049.html
Copyright © 2011-2022 走看看