1.什么是索引
索引是用于加速数据检索的数据库结构。索引类似于书籍的目录,可以让数据库在大量数据中快速找到所需的记录。
索引是为了提高数据检索的速度。它通过维护一个数据结构(如 B+ 树、哈希表等),加速对表中数据的访问。
索引记录了数据列的值和对应数据行的指针(或地址),使得数据库可以快速定位到具体的数据行。
2.索引分类
按照功能划分为:普通索引、唯一索引、主键索引、全文索引、前缀索引。
按照存储划分为:聚簇索引(主键索引)、二级索引(辅助索引)。
按照结构划分为:B+数索引、哈希索引、Full-texts索引。
按照字段个数划分为:单例索引、联合索引。
主键索引:唯一标识表中的每一行数据,所有主键索引都是聚簇索引,索引结构和数据存储在一起。
ALTER TABLE table_name ADD PRIMARY KEY (column1); -- 在已有表上添加主键索引
唯一索引:确保索引列中的值唯一。
ALTER TABLE table_name ADD UNIQUE (column2); -- 在已有表上添加唯一索引
普通索引:用于提高查询性能,但不强制唯一性。
全文索引:用于在文本数据中进行全文搜索。使用倒排索引作为底层数据结构来支持全文搜索功能。
前缀索引:前缀索引只对列的前几个字符进行索引,前缀索引主要用于对字符串列的索引,尤其是当列的内容较长时。
创建前缀索引:
CREATE INDEX idx_email_prefix ON users(email(10));
聚簇索引:数据行与索引存储在一起,innodb中主键索引、唯一非空索引会被当做为聚簇索引。
非聚簇索引:索引和数据分开存储,索引包含指向数据行的指针。
哈希索引:通过将键值(通常是字段值)传入哈希函数,计算出一个哈希值,然后使用该哈希值来快速定位相应的记录。
倒排索引:全文检索的高效索引结构。它通过将文档中的每个词汇映射到包含该词汇的文档列表中,从而加速文本查询。
3.覆盖索引
一个索引包含了满足查询结果的数据就叫做覆盖索引,不需要回表等操作。
覆盖索引是非聚簇索引的一种形式,它包括在查询里的SELECT、JOIN和WHERE子句用到的所有列 (即建索引的字段正好是覆盖查询条件中所涉及的字段)
在覆盖索引情况下,不等于(!=)索引生效,左模糊匹配索引生效。
覆盖索引创建方式:
CREATE INDEX idx_date_dept ON employees(hire_date, department_id, emp_id, salary);
4.索引下推
索引下推是 MySQL 5.6 引入的一项优化技术,它通过将部分查询条件“下推”到索引扫描阶段,从而减少不必要的行访问和回表操作,提高查询性能。
索引下推优化核心思路:在执行查询时,数据库引擎会将查询条件分为两部分:索引条件和非索引条件。索引条件是可以直接在索引中进行检查的部分,而非索引条件则需要回表后进行检查。在索引下推优化中,数据库引擎会将一些非索引条件推送到索引扫描阶段进行处理,从而在扫描索引时就过滤掉不满足条件的记录。
只有在索引扫描阶段已经满足所有条件的记录才会被回表读取,这样可以减少回表的次数和I/O操作,提高查询性能。
开启索引下推开启:
SET GLOBAL optimizer_switch = 'index_condition_pushdown=on';
索引下推适用场景:
(1)使用组合索引且查询中涉及索引中的多个列时,索引下推可以有效减少回表操作。
(2)查询条件比较复杂,且可以在索引中进行部分判断的情况下,索引下推能够提高效率。
(3)MySQL 5.6版本引入索引下推并默认开启,之前版本不支持索引下推。
(4)必须使用InnDB或MyISAM存储引擎。
(5)索引下推应用于二级索引,从而减少I/O操作。
(6)当使用覆盖索引时,不支持索引下推。