zoukankan      html  css  js  c++  java
  • 索引的分析

    一、为什么要创建索引?

     合理的创建索引可以大大提高系统的性能。

    二、索引的分类

    2.1. 普通索引
           仅加速查询
    2.2. 主键索引
           加速查询+列值唯一,一张表最多只能创建一个主键索引
    2.3. 唯一索引
           加速查询+列值唯一(允许有空值,如果是组合索引,则列值的组合必须唯一)
    2.4. 组合索引
           多列值组成一个索引,专门用于组合搜索,最左原则:索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效
    2.5. 全文索引
           全文索引(Full Text):在定义的值中支持全文查找,允许空值和重复值,可以在CHAR,VARCHAR或者TEXT字段类型上创建,仅支持MyISAM存储引擎

    2.6. 空间索引
           针对空间数据做的索引,支持的数据类型有4种,分别是GEOMETRY,POINT,LINESTRING和POLYGON。创建空间索引的列必须声明为非空值(NOT NULL),仅支持MyISAM存储引擎

    三、索引的操作

    索引的创建
    
    ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出现多次。
    
    ALTER TABLE tbl_name ADD INDEX index_name (columnA,columnB,columnC): 添加组合索引。
    
    ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。
    
    ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。
    
    ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):该语句指定了索引为 FULLTEXT ,用于全文索引。
    
    或
    
    CREATE INDEX indexName ON tbl_name (column_list);
    
    删除索引
    
    DROP INDEX idx_no_name on customer ;
    
    索引的查看
    
    SHOW INDEX FROM table_name;
    

      

    四、索引优缺点:

    4.1. 优点
       4.1.1. 通过创建主键索引和唯一索引,可以保证表中每一行数据的唯一性。 
       4.1.2. 可以大大加快 数据的检索速度,这也是创建索引的最主要的原因。 
       4.1.3. 可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。 
       4.1.4. 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。 
       4.1.5. 通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
    4.2. 缺点

       4.2.1. 创建索引和维护索引要耗费时间,会随着数据量的增加而增加。 
       4.2.2. 索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间。如果要建立聚簇索引,那么需要的空间就会更大。 
       4.2.3. 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

    五、什么样的字段适合创建索引?

           一般来说,应该在这些列上创建索引:
       5.1. 在经常需要搜索的列上,可以加快搜索的速度; 
       5.2. 在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构; 
       5.3. 在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度; 
       5.4. 在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的; 
       5.5. 在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;

    六、什么样的字段不适合创建索引?

         一般来说,不应该创建索引的的这些列具有下列特点:
       6.1. 对于那些在查询中很少使用的字段。 
       6.2. 对于那些只有很少数据值的列也不应该增加索引。例如:性别列       
       6.3. 对于那些定义为text, image和bit数据类型的列不应该增加索引。这些列的数据量要么相当大,要么取值很少。 
       6.4. 当修改性能远远大于检索性能时,不应该创建索引。因为修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。

    七、哪些情况不会走索引?

    添加索引确实能够让查询速度飞起来,但是前提必须正确使用了索引,否则即使建立了索引也不会奏效,导致索引失效要分析查询语句,注意以下几点:

      1. 当or 条件中存在未建立索引的列,即使其中有条件带有索引,也不会使用,如:select * from table where  name ='张三'  or  id ='15' 
      2. 对于多列索引,条件中不带第一部分,不会走索引 ,如:select * from table where idcard='xxxx' and add_time >'xxxx';
      3. like查询是以%开头,如:select * from table where name like '%bbb';
      4. 没有查询条件,或者查询条件没有建立索引
      5. 查询的数据量是大表的大部分,大约30%+
      6. 查询条件使用函数在索引列上,或者对索引列进行运算,select * from table where id-1=9;
      7. 记录数太少(mysql估计使用全表扫描,要比使用索引快,则不会使用索引)
      8. not in   或 not exist
      9. 在索引的列上使用表达式或者函数会使索引失效,例如:select * from users where YEAR(adddate)<2007,将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成:select * from users where adddate<’2007-01-01′。其它通配符同样,也就是说,在查询条件中使用正则表达式时,只有在搜索模板的第一个字符不是通配符的情况下才能使用索引。
      10. 在查询条件中使用不等于,包括<符号、>符号和!=会导致索引失效。(特例:1.主键索引使用 != ,则索引不会失效;2. 索引列使用 >  and < 包含的记录数比例较小,则索引不会失效 )
      11. 在查询条件中使用IS NULL或者IS NOT NULL会导致索引失效。
      12. 尽量不要包括多列排序,如果一定要,最好为这队列构建组合索引;
      13. 使用join 代替子查询
      14. 组合查询,不符合最左原则,不是组合查询也需要符合最左原则 ?
  • 相关阅读:
    MillerRabin
    BM算法总结
    高斯消元处理自由变元的方法
    [IOI2019]矩形区域
    费用流处理负圈的方法
    回文自动机(PAM)总结
    [TJOI2017]龙舟
    luogu P2252 [SHOI2002]取石子游戏|【模板】威佐夫博弈
    博弈论
    构造
  • 原文地址:https://www.cnblogs.com/unknows/p/14349830.html
Copyright © 2011-2022 走看看