MySQL索引类型大汇总
MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度,合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车,索引分单列索引和组合索引,单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引,组合索引,即一个索引包含多个列,创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件),索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,上面都在说使用索引的好处,但过多的使用索引将会造成滥用,因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE,因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件,建立索引会占用磁盘空间的索引文件。
以下是关于MySQL索引类型的详细解析:
索引类型 | 特点 | 适用场景 |
FULLTEXT | 全文索引,目前只有MyISAM引擎支持,其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不过目前只有 CHAR、VARCHAR ,TEXT 列上可以创建全文索引。 | 用于解决WHERE name LIKE “%word%"这类针对文本的模糊查询效率较低的问题。 |
HASH | 由于HASH的唯一(几乎100%的唯一)及类似键值对的形式,很适合作为索引,HASH索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率,这种高效是有条件的,即只在“=”和“in”条件下高效,对于范围查询、排序及组合索引仍然效率不高。 | 适用于等值查询和“in”查询。 |
BTREE | BTREE索引就是一种将索引值按一定的算法,存入一个树形的数据结构中(二叉树),每次查询都是从树的入口root开始,依次遍历node,获取leaf,这是MySQL里默认和最常用的索引类型。 | 适用于大多数查询场景,特别是范围查询和排序。 |
RTREE | RTREE在MySQL很少使用,仅支持geometry数据类型,支持该类型的存储引擎只有MyISAM、BDb、InnoDb、NDb、Archive几种,相对于BTREE,RTREE的优势在于范围查找。 | 适用于空间数据类型的范围查找。 |
以下是关于MySQL索引种类的详细解析:
索引种类 | 特点 |
普通索引 | 仅加速查询。 |
唯一索引 | 加速查询 + 列值唯一(可以有null)。 |
主键索引 | 加速查询 + 列值唯一(不可以有null)+ 表中只有一个。 |
组合索引 | 多列值组成一个索引,专门用于组合搜索,其效率大于索引合并。 |
全文索引 | 对文本的内容进行分词,进行搜索。 |
覆盖索引 | select的数据列只用从索引中就能够取得,不必读取数据行,换句话说查询列要被所建的索引覆盖。 |
以下是关于操作索引的详细解析:
操作 | SQL语句 |
创建普通索引 | CREATE INDEX index_name ON table_name(col_name); |
创建唯一索引 | CREATE UNIQUE INDEX index_name ON table_name(col_name); |
创建普通组合索引 | CREATE INDEX index_name ON table_name(col_name_1,col_name_2); |
创建唯一组合索引 | CREATE UNIQUE INDEX index_name ON table_name(col_name_1,col_name_2); |
通过修改表结构创建索引 | ALTER TABLE table_name ADD INDEX index_name(col_name); |
创建表时直接指定索引 | CREATE TABLE table_name (ID IN NOT NULL,col_name VARCHAR (16) NOT NULL,INDEX index_name (col_name)); |
删除索引 | 直接删除索引DROP INDEX index_name ON table_name;修改表结构删除索引ALTER TABLE table_name DROP INDEX index_name; |
以下是关于创建索引的时机的详细解析:
| 时机 | 描述 |
| | |
| WHERE和JOIN中出现的列需要建立索引,但也不完全如此,因为MySQL只对<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE才会使用索引,SELECT t.Name FROM mytable_t LEFT JOIN mytable_m ON t.Name=m.username WHERE m.age=20 AND m.city= '郑州' ;此时就需要对city和age建立索引,由于mytable_m表的userame也出现在了JOIN子句中,也有对它建立索引的必要,但是注意,当通配符%和_开头作查询时,MySQL不会使用索引。 |
MySQL 索引是数据库表中用于快速检索数据的数据结构,它们可以显著提高查询性能,但也会增加维护成本,以下是对 MySQL 中可用的索引类型的详细汇总:
1. BTree 索引
BTree 是 MySQL 中默认的索引类型,适用于大多数情况,它是一种自平衡的树结构,可以有效地处理范围查询和排序操作。
特点:自动平衡,支持范围查询和排序。
适用场景:大多数情况,特别是需要范围查询的场景。
2. RTTree 索引
RTTree(RTree)索引是一种空间索引,用于存储二维空间数据,它适用于地理空间数据和其他空间数据类型。
特点:支持空间数据查询。
适用场景:空间数据库和地理信息系统(GIS)。
3. Hash 索引
Hash 索引通过哈希函数直接定位到行数据的位置,它的查找速度非常快,但只能用于精确匹配的查询。
特点:查找速度快,但只支持精确匹配。
适用场景:需要快速查找且查询条件为精确匹配的场景。
4. FullText 索引
FullText 索引用于全文搜索,它允许用户对文本数据进行搜索,并返回包含特定单词或短语的记录。
特点:支持全文搜索。
适用场景:需要进行全文搜索的场景。
5. InnoDB 的聚簇索引(Clustered Index)
InnoDB 引擎的聚簇索引将数据行存储在索引中,而不是在数据表中,这意味着具有相同索引键值的行会存储在一起。
特点:提高查询性能,减少I/O操作。
适用场景:InnoDB 表,尤其是查询中经常包含索引键的场景。
6. InnoDB 的辅助索引(Secondary Index)
InnoDB 的辅助索引与聚簇索引类似,但它们存储了非主键列的数据,它们通常用于查询中不包含主键列的场景。
特点:提高查询性能,尤其是对于辅助列。
适用场景:InnoDB 表,查询中涉及辅助列的场景。
7. MyISAM 的索引
MyISAM 引擎支持两种索引:主索引和辅助索引。
特点:主索引是唯一的,辅助索引可以重复。
适用场景:MyISAM 表,对查询性能要求较高的场景。
8. Spatial 索引
Spatial 索引是一种特殊的索引,用于存储地理空间数据,它与 RTTree 索引类似,但具有更丰富的功能。
特点:支持多种空间操作,如距离、包含等。
适用场景:地理空间数据库和 GIS。
选择合适的索引类型对于提高数据库性能至关重要,以下是一些选择索引类型时应考虑的因素:
查询类型:根据查询类型(范围查询、精确匹配、全文搜索等)选择合适的索引。
数据类型:不同数据类型(如字符串、整数、空间数据等)适用于不同的索引类型。
存储引擎:不同存储引擎(如 InnoDB、MyISAM)支持不同的索引类型。
性能和成本:索引可以提高查询性能,但也会增加维护成本,根据实际需求权衡性能和成本。
希望这个汇总能帮助您更好地了解 MySQL 中的索引类型。