索引优化

什么是索引?为什么要建立索引?

索引用于快速找出在某个列中有一特定值的行,不使用索引 MySQL 必须从第一条记 录开始读完整个表,直到找出相关的行,表越大查询数据所花费的时间就越多,如果表中 查询的列有一个索引,MySQL 能够快速到达一个位置去搜索数据文件,而不必查看所有 数据,那么将会节省很大一部分时间。 例如:有一张 person 表,其中有 2W 条记录,记录着 2W 个人的信息。有一个 Phone 的字段记录每个人的电话号码,现在想要查询出电话号码为 xxxx 的人的信息。 如果没有索引,那么将从表中第一条记录一条条往下遍历,直到找到该条信息为止。 如果有了索引,那么会将该 Phone 字段,通过一定的方法进行存储,好让查询该字 段上的信息时,能够快速找到对应的数据,而不必在遍历 2W 条数据了。其中 MySQL 中 的索引的存储类型有两种:BTREE、HASH。 也就是用树或者 Hash 值来存储该字段,要 知道其中详细是如何查找的,需要一定的算法知识了。

B-Tree

B-Tree 索引,它是目前关系型数据库中查找数据最为常用和有效的索引,大多数存储 引擎都支持这种索引。使用 B-Tree 这个术语,是因为 MySQL 在 CREATE TABLE 或其它 语句中使用了这个关键字,但实际上不同的存储引擎可能使用不同的数据结构,比如 InnoDB 就是使用的 B+Tree。 B+Tree 中的 B 是指 balance,意为平衡。需要注意的是,B+树索引并不能找到一个 给定键值的具体行,它找到的只是被查找数据行所在的页,接着数据库会把页读入到内存, 再在内存中进行查找,最后得到要查找的数据。

索引的优点和缺点

优点

1、所有的 MySql 列类型(字段类型)都可以被索引,也就是可以给任意字段设置索引

2、大大加快数据的查询速度

缺点

1、创建索引和维护索引要耗费时间,并且随着数据量的增加所耗费的时间也会增加

2、索引也需要占空间,我们知道数据表中的数据也会有最大上线设置的,如果我们 有大量的索引,索引文件可能会比数据文件更快达到上线值

3、当对表中的数据进行增加、删除、修改时,索引也需要动态的维护,降低了数据 的维护速度。

总结

使用原则 通过上面说的优点和缺点,我们应该可以知道,并不是每个字段度设置索引就好,也 不是索引越多越好,而是需要自己合理的使用。 并不是所有索引对查询都有效 并不是所有索引对查询都有效,SQL 是根据表中数据来进行查询优化的,当索引列有 大量数据重复时,SQL 查询可能不会去利用索引,如一表中有字段 sex,male、female 几乎各一半,那么即使在 sex 上建了索引也对查询效率起不了作用。 索引并不是越多越好 索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效 率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具 体情况而定。一个表的索引数较好不要超过 6 个,若太多则应考虑一些不常使用到的列上 建的索引是否有必要。

索引使用的注意事项

经常更新的表就避免对其进行过多的索引 对经常更新的表就避免对其进行过多的索引,对经常用于查询的字段应该创建索引。

数据量小的表最好不要使用索引 数据量小的表最好不要使用索引,因为由于数据较少,可能查询全部数据花费的时间 比遍历索引的时间还要短,索引就可能不会产生优化效果。

避免在不同值少的列上加索引 在一不同值少的列上(字段上)不要建立索引,比如在学生表的"性别"字段上只有男, 女两个不同值。相反的,在一个字段上不同值较多可以根据需要建立索引。

根据业务需求建立索引 索引的建立要根据业务特点进行,不能凭空想象的设置索引。经常作为查询条件的列 才有建立索引的必要性。

索引的分类 索引是在存储引擎中实现的,也就是说不同的存储引擎,会使用不同的索引。MyISAM 和 InnoDB 存储引擎:只支持 BTREE 索引,也就是说默认使用 BTREE,不能够更换, MySQL5.7 中 InnoDB 可以支持 HASH 索引;MEMORY/HEAP 存储引擎:支持 HASH 和 BTREE 索引。索引可划分为单列索引(其中包括普通索引、唯一索引、主键索引)、组合 索引、全文索引、空间索引,其中单列索引是一个索引只包含单个列,但一个表中可以有 多个单列索引。

普通索引 MySQL 中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值, 纯粹为了查询数据更快一点。 Index(xx) 或者 key(xx)

唯一索引 索引列中的值必须是唯一的,但是允许为空值, UNIQUE INDEX UniqIdx(xx)

主键索引 是一种特殊的唯一索引,不允许有空值。 PRIMARY KEY(id)

组合索引 在表中的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段 时,索引才会被使用,使用组合索引时遵循最左前缀集合。 INDEX MultiIdx(id,name,age) 由 id、name 和 age3 个字段构成的索引,索引行中就按 id/name/age 的顺序存放, 索引可以索引下面字段组合(id,name,age)、(id,name)或者(id)。如果要查询的字段不 构成索引最左面的前缀,那么就不会是用索引,比如,age 或者(name,age)组合就不 会使用索引查询

你可能感兴趣的:(索引优化)