数据库索引:索引介绍和使用原则
Posted hideveloper
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库索引:索引介绍和使用原则相关的知识,希望对你有一定的参考价值。
一、数据页与索引页
数据库的表存储分为数据页存储和索引页存储,索引页中储存的是指数据页的指针。索引页所占的存储空间比数据页要小很多。
二、聚簇索引与非聚簇索引
索引(Index)的存储方式分为两种:聚簇索引(Clustered Index)和非聚簇索引(Nonclustered Index)。
聚簇索引:它并不是一种单独的索引类型,而是一种数据存储方式,它指定了数据在表中的物理存储顺序。因为单个表在磁盘上只能有一个物理记录排序方式,所以一个表只能有一个聚簇索引。指定索引列后,数据会按照索引列重新一一排序(未指定情况下是按照主键排序的),并将其存储为表的副本。此副本(数据页)和索引页存储需要额外占用的空间大小,至少是该表的120%。此外,在插入新行、更新行的索引列值时,DBMS将自动对数据重新排序,经常大量插入行或更新索引列的值时,尽量不要使用聚簇索引。
非聚簇索引:非聚簇索引的顺序不影响数据的物理存储顺序的。如果说聚簇索引是一本词典的a-z排序方式(物理存储方式),那么非聚簇索引就是词典后面的各种附录索引。不同的附录索引里的关键字排序是不一样的,但是可以根据这个索引快速定位到单词所在的页数(物理位置)。其查询速度没有聚簇索引快,但是在一定程序上可以提高查询效率。一张表最多可以创建249个非聚簇索引,每个非聚簇索引都需要进行索引页的存储。因为它占用很多空间的,所以非聚簇索引并不是越多越好。
三、唯一索引
唯一索引:一种特殊的索引,不允许索引值重复。也就是指定的索引列,不能出现重复的值,有点类似主键。创建该索引时,DBMS会检查是否有重复的索引值,如果有会报错,创建索引失败。索引创建后,会在每次使用 INSERT 或 UPDATE 语句添加数据时进行检查。
四、索引的创建
数据库创建索引需要有唯一的名字,指明索引名和索引列,且索引名不可与表名重复。
以mysql的创建索引为例
聚簇索引创建语句:
create clustered index [index_name]
on [table_name] ([column1], [column2], ...)
非聚簇索引创建语句:
create index [index_name]
on [table_name] ([column1], [column2], ...)
聚簇唯一索引创建语句:
create clustered unique index [index_name]
on [table_name] ([column1], [column2], ...)
非聚簇唯一索引创建语句:
create unique index [index_name]
on [table_name] ([column1], [column2], ...)
五、索引的使用规则
1、小数据的表不需要创建索引,因为没啥卵用,这并不能提高查询效率。
2、用户查询的字段数据有很多数值或者很多NULL时,创建索引可以提高查询效率。
3、查询返回的数据结果行少于总量的25%,索引可显著提高查询效率;反之,索引的作用就不大了。
4、索引列必须在where中频繁使用,否则其作用就不大。
5、初始化表数据时,先装入数据,后创建索引。否则,每加一条数据都要更新索引,开销大。
6、索引提高了检索速度,降低了数据的更新速度。对表进行大量写入和更新时,建议先移除索引,再创建索引,可节省时间,提高效率。
7、索引会占用数据库空间,设计数据库时需要考虑其大小。
8、表和其索引尽量存储于不同的磁盘上,可提高查询速度。这个涉及到硬盘数据的读取原理。
以上是关于数据库索引:索引介绍和使用原则的主要内容,如果未能解决你的问题,请参考以下文章