数据库索引总结
Posted godoforange
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库索引总结相关的知识,希望对你有一定的参考价值。
高强度训练第十九天总结:
为什么要用索引
- 通过创建唯一性索引可以保证数据库表中每一行数据的唯一性
- 可以大大加快数据的检索速度(大大减少了检索的数据量),这也是创建索引最主要的原因。
- 帮助服务器避免排序和临时表
- 将随机IO变为顺序IO
- 可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
索引这么多优点,为什么不对表中的每一个列创建一个索引呢?
- 当表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据维护的速度。
- 索引修啊占物理空间,除了数据表占数据空间之外,每一个索引还需要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
- 创建索引和维护索引需要耗费时间,这种时间随着数据量的增加而增加。
索引是如何提高查询速度的?
- 将无序的数据变成相对有序的数据(就像查目录一样)
使用索引的注意事项
- 在经常需要搜索的列上,可以加快搜索的速度
- 在经常使用where子句的列上面创建索引,加快条件的判断速度。
- 在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询的时间
- 对于中到大型表索引都是非常有效的,但是特大型表的话维护开销会很大,不适合建索引
- 在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度
- 避免where子句中对字段施加函数,这会造成无法命中索引
- 在使用InnoDB时使用与业务无关的自增主键为主键,即使用逻辑主键,而不要使用业务主键。
- 将打算加索引的列设置为NOT NULL,否则将导致引擎放弃使用索引而进行全表扫描
- 删除长期未使用的索引,不用的索引的存在会造成不必要的性能损耗mysql5.7可以通过查询sys库中的chema_unused_indexes视图来查询哪些索引从未被使用
- 在使用limit offset 查询缓慢时,可以借助索引来提高性能。
MySQL 索引主要使用的俩种数据结构
- 哈希索引 对于哈希索引来说,底层的数据结构就是hash表,因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余大部分场景建议选择BTree索引。
- BTree索引 Mysql的Btree索引使用的时B树中的B+Tree,但是对于主要的俩种存储索引MyISAM和InnoDB的实现方式是不同的
MyISAM和InnoDB实现索引方式的区别
MyISAM:B+Tree叶结点的data域存放的是数据记录的地址。在索引检索的时候,首先按照B+Treee搜索算法搜索索引,如果指定的Key存在,则取出其data域值,然后以data域的值为地址读取相应的数据记录。这被称为“非聚簇索引”
InnoDB:其数据文件本身就是索引文件。相比MyISAM,索引文件和数据文件是分离的,其表数据文件本身就是按B+Tree组织的一个索引结构,树的叶结点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据库文件本身就是主索引。被称为聚簇索引。
以上是关于数据库索引总结的主要内容,如果未能解决你的问题,请参考以下文章