在关系型数据库中,索引是加快数据检索的数据库结构,主要用于提高性能。使用索引查询数据,不需要再检索整个数据库,大大提高检索效率。
一、什么是索引?
索引是一个单独的、物理的数据库结构,是某个表中一列或若干列的集合以及相应标识这些数据页逻辑指针清单。索引是依赖于表建立的,提供了数据库中编排表中数据的内部方法。
表的存储有两部分组成:一部分是表的数据页面,另一部分是索引页面。索引就存放在索引页面上。通常,索引页面相对于数据页面小得多。当进行数据检索时,系统先搜索索引页面,从中找到所需数据的指针,再直接通过指针从数据页数据中读取数据。
在某种程度上可以把数据库堪称一本书,把索引堪称书的目录通过目录查询这本书的信息,显然比查找没有目录的书要方便、快捷。
索引一旦建创建,将由数据库自动管理和维护。例如,向表中插入、更新和删除一条记录时,数据库会自动在索引中做出相应的修改。在编写SQL查询语句时,具有索引的表和没有索引的表没有任何区别,索引只是提供一种快速访问指定记录的方法。
1.1 索引可以提高数据的访问速度
只要为适当的字段建立索引,就能大幅提高一下操作的速度。
-
- 查询操作中 WHERE 子句的数据提取。
- 查询操作中 ORDER BY 子句的数据排序。
- 查询操作中 GROUP BY 子句的数据分组。
- 更新和删除数据记录。
1.2 索引可以保证数据的唯一性
唯一性索引的创建可以保证表中的数据记录不重复。
在MySQL中,索引是在储存引擎中实现的,因此每种储存引擎的索引都不一定完全按相同,并且每种储存引擎也不一定支持所有的索引类型。根据储存引擎定义每个表的最大索引数和最大索引长度。所有储存引擎支持每个表至少16个索引,总索引长度至少为256个字节。大多数储存引擎有更高的限制。MySQL中索引的储存类型有两种,即BTREE和HASH,具体和表的存储引擎相关。MySQL和InnoDB存储引擎只支持BTREE索引,MEMORY/HEAP存储引擎可以支持HASH和BETREE索引。
虽然索引有诸多优点,但仍要注意避免在一个表上创建大量的索引,因为这样不但会影响插入、删除、更新数据等性能,也会在变更表中的数据时增加调整索引索引的操作,降低系统的维护速度。
二、索引的类型
MySQL的索引可以分为以下几类:
2.1 普通索引和唯一索引
普通索引是MySQL的基本所有类型,允许在定义索引的列中插入重复值和空值。
唯一索引是指索引的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。主键索引是一种特殊的唯一索引,不允许有空值。
2.2 单列索引和组合索引
单列索引是指索引只包含单个列,一个表可以用多个单列索引。
组合索引是指在表的多个字段组合上创建索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用。使用组合索引时遵循最左前缀集合。
2.3 全文索引
全文索引是指在定义索引的列上支持值得全文查找,允许在这些索引列中插入重复值和空值。全文索引可以在 CHAR、VARCHAR和TEXT 类型得列上创建。MySQL中只有MyISAM存储索引支持全文索引。
2.4 空间索引
空间索引是指对空间类型得字段简历得索引。MySQL得空间数据类型有4中,分别是 GEOMETYR、POINT、LINESTRING、POLYGON。对于初学者来说,这类索引很少会用到。
三、索引的设计原则
索引的设计不合理或者缺少索引,都会对数据库和应用性能造成障碍。高效的索引对于良好的性能非常重要。设计索引时,应该考虑以下准则。
3.1 索引并非越多越好
一个表中如有大量的索引,不仅占用磁盘空间,还会影响 INSERT、DELETE、UPDATE 等语句得性能。因为当表中得数据在更改的同时,索引也会进行调整和更新。
3.2 避免对经常更新的表进行过多的索引
避免对经常更新的表进行过多的索引,并且索引的列尽可能的少。对经常用于查询的字段应该建立索引,但要避免添加不必要的字段。
3.3 数据量小的表尽量不使用索引
由于数据较少,查询花费的时间可能比遍历索引还要短,索引可能不会产生优化效果。
3.4 在不同值少的列上不要建立索引
在条件表达式中经常用到条件值较多的列上建立索引,在不同值少的列上不要建立索引。例如学生表的性别字段,只有‘男’和‘女’两个不同值,因此就无需建立索引。如果建立索引,不但不会提高查询效率,反而会严重降低更新速度。
3.5 指定唯一索引是由某种数据的特征来决定
当唯一性是某种数据的特征时,指定唯一索引。使用唯一索引,能确保列数据的完整性,以提高查询速度。
四、创建索引
创建索引是指在某个表的一列或多个列上建立一个索引,以提高对标的访问速度。在实际创建索引之前,有如下几个注意事项:
- 当给表创建 UNIQUE 约束时,MySQL会自动创建唯一索引。
- 索引的名称必须符合MySQL的命名规则,且必须是表中唯一的。
- 可以在创建表时创建索引,或则给现存的表创建索引。
- 只有表的所有者才能给表创建索引。
4.1 创建表时创建索引