索引的概述

关于各种数据库的特性

关于MySQL:关系型数据库,能清楚的表示数据之间的关系,并且,是基于磁盘存储的,可以使用相对较低的成本存储大量的数据。

关于Redis:是基于K-V结构的在内存中读写数据的数据库(虽然也会自动同步到磁盘),能够明显的提高查询效率(通常设计预期不低于10万QPS),进而还可以保护关系型数据库,并且,通常是使用专门的服务器或集群,也可以作为整个集群中的共享内存资源 关于elasticsearch:用于解决搜索问题的非关系型文档数据库。

关于elasticsearch:用于解决搜索问题的非关系型文档数据库。

关系型数据库中的索引

索引的概念 

在关系型数据库中,索引(index)是一种单独的、物理层面的对数据库中的一列或多列的值进行排序检索的一种数据结构。

为何使用索引 

如果没有做任何优化的处理,当MySQL这类数据库中的数据量较多时,查询效率会非常低下,这是因为在执行查询时,MySQL会把当前表中所有的数据全部检查一遍,检查每条数据是否匹配当前的查询规则!另外,MySQL是基于磁盘存储的,数据不会非常整齐的集中存储在磁盘的某个位置,而是散列的分布的磁盘的不同位置,例如:

所以,在查询时,会需要频繁的执行IO操作,最终,实际表现查询效率非常低!

索引的语法 

创建索引

在MySQL中,创建索引的简单语法是:

CREATE INDEX index_name ON table_name (column_name[, column_name_2 ...]);

例如:

CREATE INDEX idx_username ON account_user (username);

对于某张表的某个字段的索引,只需要创建1次即可!当创建索引后,索引对应的列的查询效率都可以在毫秒级完成!注意:在创建索引时,表中的数据越多,创建索引的耗时越多!

删除索引

删除索引的语法格式是:

DROP INDEX index_name ON table_name;

例如:

DROP INDEX idx_username ON account_user;

索引的本质

在创建索引时,MySQL会将对应字段的数据进行排序,并在索引中记录下每条数据的位置信息,所以,索引就相当于是“书的目录”,后续,当需要查询时,会先翻“书的目录”,找出数据对应的“页码”,并直接翻到对应的那一页,就能把数据全部找出来!所以,整体效率非常之高!

索引的本质是一种B+Tree结构(是一种树型结构)的数据,在MySQL中,InnoDB存储引擎中页的大小是16KB,如果使用BIGINT类型的主键,每个主键需要占用8字节,在B+Tree中的指针是4~8字节,每个指针与主键形成一个节点,则每个节点将占用最多16字节,每页最少可以存储1024个节点,深度为3的B+Tree最多可以存储1024 * 1024 * 1024个节点,大约是1000 * 1000 * 1000 = 1000000000个节点(10亿),所以,每个B+Tree可以维护约10亿个节点,如果表中的数据量不超过10亿条,都只需要最多执行3次IO操作,就可以找出数据的位置。阿里规范500万条数据分库分表

索引的种类 

在数据库,即使你没有显式的创建索引,某些字段的查询效率可能也非常高,因为索引还有其它种类,包括:

  • PRIMARY KEY:主键索引
  • UNIQUE:唯一索引
  • INDEX:普通索引
  • FULLTEXT:全文索引

索引的特性

基于索引的特性,使用时,必须注意:

  • 索引不会包含有NULL值的列。
  • 数据量非常少的表没有必要创建索引,例如绝大部分字典表,或数据量不多且修改频率也非常低的表也没有必要创建索引,例如资讯平台的“栏目”或“类别”、小型应用中“用户的角色”。
  • 数据经常变化的字段不要创建索引,因为会频繁的更新索引,导致更新效率低下
  • 查询时需要计算字段值时,索引是无效的,例如:where age + 10 > 30时,age列的索引是无效的
  • 左侧的模糊查询无法使用索引,因为索引是基于对这一列的数据进行排序得到的
    • 其实,在开发实践中,所有模糊查询都是不允许使用的
    • 因为创建索引是根据字段的内容进行排序,左模糊查询(‘%xxx’)的话,就没办法根据模糊的地方进行排序,即使可以创建,也是无效的。但仔细想一下,做搜索功能的时候,不可能做成左模糊或者右模糊查询,更不可能去要求用户使用左模糊查询或者右模糊查询,所以搜索功能是左右模糊查询,也就是说用户在搜索的,也不确定哪些结果是左模糊,哪些结果是有模糊,因此模糊查询就不去使用索引。

除了以上限制以外,不同的企业的开发规范可能提出更高的要求:

  • 类型为text的字段不允许使用索引
    • 例如:一本书的目录只会将第几章地几节放到目录,而不把正文放到目录里
  • 类型为varchar且字段值可能很长的字段,也不允许使用索引
  • 其它
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值