索引的分析

一、为什么要创建索引?

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

二、索引的分类

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. 组合查询,不符合最左原则,不是组合查询也需要符合最左原则 ?
posted @ 2021-01-30 17:45  就这个名字好  阅读(148)  评论(0编辑  收藏  举报