一,索引类型
索引类型 | 特点 |
---|---|
PRIMARY KEY | 主键索引,唯一标识表中的每行,不允许有空值。 |
UNIQUE | 唯一索引,索引列的所有值都只能出现一次,允许有空值。 |
INDEX | 普通索引,加快对数据的访问速度,但不限制列的唯一性。 |
FULLTEXT | 全文索引,用于全文搜索,只适用于CHAR、VARCHAR和TEXT类型的列。 |
SPATIAL | 空间索引,用于空间数据类型,如GEOMETRY ,仅在MyISAM引擎中有效。 |
FOREIGN KEY | 外键索引,用于InnoDB表,确保参照完整性。 |
二,explain语句的结果type类型
以下是type
列常见的结果类型:
类型 | 描述 |
---|---|
system | 表只有一行(等同于系统表),这是const类型的特例。 |
const | 表示通过索引一次就找到了,通常用于主键或唯一索引扫描。 |
eq_ref | 一对一关系,常见于主键或唯一索引扫描。 |
ref | 使用非唯一索引或唯一索引的非唯一前缀扫描。 |
range | 只检索给定范围的行,使用索引来选择行。 |
index | 全索引扫描,只扫描索引树。 |
all | 全表扫描,MySQL将遍历全表以找到匹配的行。 |
type
列的值是按照从最好到最差的顺序排列的,system
是最好的,all
是最差的。选择合适的索引可以提高查询效率,避免低效的全表扫描。
三,联合索引
联合索引(也称为复合索引)是指在数据库表中的两个或多个列上创建的索引。在一个联合索引中,索引的顺序是重要的,因为数据库会根据索引中列的顺序来优化查询。例如,如果一个表有一个联合索引,包括列A和列B(以此顺序),那么该索引会优化查询条件包含列A的查询,或者同时包含列A和列B的查询,但不会优化仅包含列B的查询。联合索引可以提高查询性能,但也会增加维护成本,因为每次插入或更新索引列时,索引都需要被更新。
四,联合索引底层
联合索引的底层实现原理基于B树(或变体如B+树)数据结构。在联合索引中,索引项是基于索引列的组合来构建的。具体来说:
-
索引结构:每个索引项包含联合索引中所有列的值,这些值按照索引定义的顺序排列。
-
键的组合:索引项是根据列值的组合来排序的。例如,对于一个基于列A和列B的联合索引,索引项首先按列A的值排序,列A的值相同的情况下再按列B的值排序。
-
查询优化:当执行查询时,数据库可以利用这个索引快速定位数据。如果查询条件包含索引的最左前缀(或全部),数据库可以通过索引快速过滤和定位数据。
-
B树遍历:数据库通过遍历B树来查找和访问数据,这大大减少了需要访问的数据量,提高了查询效率。
这种基于排序的键的组合使得联合索引在处理范围查询和排序查询时非常高效。