1、什么是索引?
索引(Index)是一种用于提高查询效率的数据结构。
索引通过为数据库表中的一列或多列创建一个引用,从而加快数据的检索速度。(对列创建索引)
索引类似于书的目录,可以帮助数据库快速找到所需的数据,而不必扫描整个表(不需要看完正本书)。
2、索引的类型有哪些?
索引的类型1、普通索引(Normal Index):最基本的索引类型,没有任何约束条件。
语法:CREATE INDEX index_name ON table_name (column_name);2、唯一索引(Unique Index):索引列的值必须唯一,但允许有空值。
语法:CREATE UNIQUE INDEX index_name ON table_name (column_name);3、主键索引(Primary Key Index):一种特殊的唯一索引,不允许有空值。
每个表只能有一个主键索引。
语法:PRIMARY KEY (column_name)4、全文索引(Full-text Index):用于全文搜索,主要用于查找文本内容。
适用于 CHAR、VARCHAR 和 TEXT 类型的列。
语法:CREATE FULLTEXT INDEX index_name ON table_name (column_name);
组合索引(Composite Index):在多个列上创建的索引。
语法:CREATE INDEX index_name ON table_name (column1, column2, ...);
3、索引的优点
索引的优点1、提高查询速度:
索引可以显著提高数据检索的速度,尤其是在涉及大量数据的查询中。2、加速单表的排序和分组操作:
索引可以加快 ORDER BY 和 GROUP BY 操作的执行速度。3、加速表之间的连接操作:
索引可以提高表之间连接操作的效率。
4、索引的缺点
索引的缺点1、占用空间:
索引需要额外的存储空间(物理空间),尤其是当索引列的数量和数据量较大时。2、影响写操作性能:
当对表进行插入、更新和删除操作时,索引也需要动态的维护,因此会增加增/删/改的时间。在插入、更新和删除操作时,数据库需要维护索引,以确保索引的正确性和有效性。
这意味着在执行这些操作时,除了修改表中的数据,还需要更新索引中的数据。
5、创建索引
-- 创建普通索引
CREATE INDEX idx_column_name ON table_name (column_name);-- 创建唯一索引
CREATE UNIQUE INDEX idx_unique_column_name ON table_name (column_name);-- 创建全文索引
CREATE FULLTEXT INDEX idx_fulltext_column_name ON table_name (column_name);-- 创建组合索引
CREATE INDEX idx_composite ON table_name (column1, column2);
6、删除索引
-- 删除索引
DROP INDEX index_name ON table_name;
7、索引的基本原理
数据结构:索引通常使用特定的数据结构来存储和组织数据,以便快速检索。
常见的数据结构包括B树(B-Tree)、B+树(B+Tree)和哈希表(Hash Table)。1、B+树索引:在MySQL中,B+树是最常用的索引结构,特别是InnoDB存储引擎。
B+树是一种平衡树,所有叶子节点都在同一层,并且通过链表连接。
每个节点包含多个键值和指向子节点的指针,叶子节点包含实际数据的指针。
B+树的特点是能够保持数据的有序性,并且查找、插入、删除操作的时间复杂度为O(log n)。2、哈希索引:哈希索引基于哈希表实现,适用于等值查询。
哈希索引通过哈希函数将键值映射到哈希表中的位置,从而实现快速查找。
哈希索引不适用于范围查询,因为哈希函数无法保证键值的有序性。
8、索引的工作原理
索引的工作原理
1、创建索引:
当创建索引时,数据库会根据指定的列构建索引结构,并将这些列的值和相应的行指针存储在索引中。2、查询优化:
当执行查询时,查询优化器会分析查询语句,并决定是否使用索引。
如果使用索引,数据库会通过索引快速定位到满足条件的行,而不必扫描整个表。3、维护索引:
在插入、更新和删除操作时,数据库需要维护索引,以确保索引的正确性和有效性。
这意味着在执行这些操作时,除了修改表中的数据,还需要更新索引中的数据。
9、索引设计的原则是什么?
设计高效的数据库索引是优化查询性能的关键。以下是一些常见的索引设计原则:### 1. 选择合适的列进行索引- **频繁查询的列**:索引应创建在经常出现在`WHERE`、`JOIN`、`ORDER BY`和`GROUP BY`子句中的列上。
- **高选择性列**:选择性高的列(即列中的唯一值较多)更适合创建索引,因为它们可以更有效地减少扫描的行数。### 2. 考虑索引的类型- **单列索引 vs. 复合索引**:在多列查询中,复合索引(也称为多列索引)可以比单列索引更高效,但要注意列的顺序。
- **前缀索引**:对于长字符串列,可以创建前缀索引,只索引字符串的前几个字符,以节省空间。### 3. 控制索引的数量和大小- **避免过多索引**:虽然索引可以加快查询速度,但过多的索引会增加写操作的开销(如插入、更新、删除操作)以及占用更多的存储空间。
- **索引维护**:定期检查和维护索引,删除不再使用或不必要的索引。### 4. 索引的维护和更新- **定期重建索引**:对于频繁更新的表,索引可能会变得碎片化,定期重建索引可以保持索引的性能。
- **统计信息更新**:确保数据库的统计信息是最新的,以便查询优化器能够做出最佳的查询计划。### 5. 考虑查询模式- **查询频率和类型**:根据查询的频率和类型(如读多写少或写多读少)来决定索引的设计。
- **范围查询**:对于范围查询,B+树索引更适合,而哈希索引不适用。通过遵循这些索引设计原则,可以有效地提升数据库的查询性能,同时控制索引的维护成本。每个数据库和应用场景都有其独特性,索引设计应根据具体情况进行调整和优化。
10、创建索引的原则(最重点)
1)最左前缀匹配原则,组合索引非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a=1 and b= 2 and c> 3 and d= 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。2)较频繁作为查询条件的字段才去创建索引3)更新频繁字段不适合创建索引4)若是不能有效区分数据的列不适合做索引列(如性别,男女未知,最多也就三种,区分度实在太低)5)尽量的扩展索引,不要新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可。6)定义有外键的数据列一定要建立索引。7)对于那些查询中很少涉及的列,重复值比较多的列不要建立索引。8)对于定义为text、image和bit的数据类型的列不要建立索引。
11、创建索引的三种方式
第一种:
在执行 CREATE TABLE时创建索引第二种:
在使用ALTER TABLE时去增加索引第三种:
使用CREATE INDEX命令创建
12、