数据库索引

索引

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

索引用于快速找出在某个列中有一特定值的行,不使用索引 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 个,若太多则应考虑一些不常使用到的列上 建的索引是否有必要。 

索引使用的注意事项

  1. 经常更新的表就避免对其进行过多的索引 对经常更新的表就避免对其进行过多的索引,对经常用于查询的字段应该创建索引。
  2. 数据量小的表最好不要使用索引 数据量小的表最好不要使用索引,因为由于数据较少,可能查询全部数据花费的时间 比遍历索引的时间还要短,索引就可能不会产生优化效果。
  3. 避免在不同值少的列上加索引 在一不同值少的列上(字段上)不要建立索引,比如在学生表的"性别"字段上只有男, 女两个不同值。相反的,在一个字段上不同值较多可以根据需要建立索引。
  4. 根据业务需求建立索引 索引的建立要根据业务特点进行,不能凭空想象的设置索引。经常作为查询条件的列 才有建立索引的必要性。
  5. 索引的分类 索引是在存储引擎中实现的,也就是说不同的存储引擎,会使用不同的索引。MyISAM 和 InnoDB 存储引擎:只支持 BTREE 索引,也就是说默认使用 BTREE,不能够更换, MySQL5.7 中 InnoDB 可以支持 HASH 索引;MEMORY/HEAP 存储引擎:支持 HASH 和 BTREE 索引。索引可划分为单列索引(其中包括普通索引、唯一索引、主键索引)、组合 索引、全文索引、空间索引,其中单列索引是一个索引只包含单个列,但一个表中可以有 多个单列索引。
  6. 普通索引 MySQL 中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值, 纯粹为了查询数据更快一点。 Index(xx) 或者 key(xx)
  7. 唯一索引 索引列中的值必须是唯一的,但是允许为空值, UNIQUE INDEX UniqIdx(xx)
  8. 主键索引 是一种特殊的唯一索引,不允许有空值。 PRIMARY KEY(id)
  9. 组合索引 在表中的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段 时,索引才会被使用,使用组合索引时遵循最左前缀集合。 INDEX MultiIdx(id,name,age) 由 id、name 和 age3 个字段构成的索引,索引行中就按 id/name/age 的顺序存放, 索引可以索引下面字段组合(id,name,age)、(id,name)或者(id)。如果要查询的字段不 构成索引最左面的前缀,那么就不会是用索引,比如,age 或者(name,age)组合就不 会使用索引查询
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值