两千四百万数据量SQL查询

Myslq索引对千万级数据量查询的影响_字段

没有索引时

如果字段无索引,耗时十分钟

Myslq索引对千万级数据量查询的影响_存储引擎_02

无索引查询过程

MySQL 需要对 2400 万条数据一一进行比较,假设每条记录的处理时间为 0.025 ms,那么总查询时间大约为 10 分钟(即 2400 万 × 0.025 ms)。
•全表扫描: 当查询 kh = '03356129487' 时,如果表上没有对 jd_kh 字段创建索引,MySQL 会执行全表扫描。这意味着 MySQL 需要从头到尾逐行读取表中的所有 2400 万条记录,逐条比较kh字段的值,找到符合条件的记录。
•数据量大: 由于表中有 2400 万条记录,全表扫描在每一条记录上都执行一次比较操作,耗时非常长,通常会导致查询的时间成倍增长。

有索引时

有索引时,耗时0.22秒

Myslq索引对千万级数据量查询的影响_字段_03


有索引查询过程

使用 B-Tree 索引时,查找过程可能只需要经过 20 次左右的比较操作就能定位到目标数据,处理时间仅为数毫秒。

有索引查询过程

•使用索引查找: 当在kh字段上创建了索引后,MySQL可以利用这个索引来快速定位到符合条件的记录。索引类似于一本书的目录,能够快速指向数据所在的位置,而不必逐条扫描整个表。
•索引的工作原理: 索引通常使用数据结构如 B-Tree 或 Hash 实现,这些结构使得查找操作的时间复杂度为 O(log N) 或 O(1),远远快于全表扫描的 O(N)。
•减少 IO 操作: 使用索引意味着 MySQL 不需要读取整个表,只需访问特定的索引节点,然后直接定位到目标记录,大大减少了磁盘 IO 操作的次数,从而大幅提升查询速度。

索引的影响

作用

•提高查询效率: 索引通过将查找过程缩小到更少的数据范围,大幅减少了需要扫描的数据量。
•降低计算复杂度: 索引的使用将查询复杂度从线性时间 O(N) 降低到对数时间 O(log N) 或更低,这就是查询速度差距如此之大的根本原因。

注意事项

•索引的选择: 并不是所有字段都适合创建索引,索引会占用额外的存储空间,并在数据写入(INSERT/UPDATE/DELETE)时带来一定的性能开销。因此,应该在查询频繁、选择性高的字段上创建索引。
•索引维护: 定期维护索引(如重建索引、分析表等)有助于保持索引的高效性。

索引

“索引类型”和“索引方法”是两个不同的概念。索引类型通常指的是索引的逻辑用途和特性,而索引方法则是底层的实现方式或算法。

索引类型

索引类型分为如下几种:
•普通索引 (Normal Index): 基本的索引类型,用于加速查询。
•唯一索引 (Unique Index): 保证列中的所有值唯一,防止重复。
•主键索引 (Primary Key Index): 一种特殊的唯一索引,不允许空值,表中只能有一个主键。
•全文索引 (Full-Text Index): 用于全文搜索,加速对文本数据的查询。
•组合索引 (Composite Index): 在多个列上创建的索引,用于加速多列条件查询。
•空间索引 (Spatial Index): 用于空间数据类型(如 Geometry)的查询。
•函数索引 (Functional Index): 基于表达式或函数结果的索引,用于加速对函数计算结果的查询。

普通索引 (Normal Index)

•描述: 普通索引是最基本的索引类型,用于加速查询操作。
•用途: 提高查询效率,但不保证唯一性。
•语法: CREATE INDEX index_name ON table_name(column_name);

唯一索引 (Unique Index)

•描述: 唯一索引与普通索引类似,但要求索引列中的所有值都必须唯一。
•用途: 确保数据列中的值唯一,防止重复数据。
•语法: CREATE UNIQUE INDEX index_name ON table_name(column_name);

主键索引 (Primary Key)

•描述: 主键索引是一种特殊的唯一索引,不允许空值,表中只能有一个主键。
•用途: 唯一标识表中的每一行数据,同时加速查询。
•语法: PRIMARY KEY (column_name); (通常在创建表时定义)

全文索引 (Full-Text Index)

•描述: 全文索引用于加速对文本数据的搜索,支持复杂的文本查询。
•用途: 搜索大型文本字段,如 CHAR、VARCHAR、TEXT 等字段中的单词或短语。
•语法: CREATE FULLTEXT INDEX index_name ON table_name(column_name);
•注意: 全文索引仅支持 InnoDB 和 MyISAM 存储引擎,MySQL 5.7.6 开始,MySQL内置了ngram全文解析器,用来支持中文、日文、韩文分词。

组合索引 (Composite Index)

•描述: 组合索引是在多个列上创建的索引,用于加速包含多个条件的查询。
•用途: 当查询涉及多个列时,可以利用组合索引提高效率。
•语法: CREATE INDEX index_name ON table_name(column1, column2, ...);
•注意: 组合索引的列顺序非常重要,MySQL 只能利用索引最左前缀(即从左到右匹配的列)。

空间索引 (Spatial Index)

•描述: 空间索引用于加速空间数据类型(如 Geometry)的查询。
•用途: 适用于存储和查询空间数据,如地理信息系统 (GIS)。
•语法: CREATE SPATIAL INDEX index_name ON table_name(column_name);
•注意: 空间索引仅支持 MyISAM 存储引擎,并且要求索引列为 NOT NULL。

函数索引 (Functional Index)

•描述: 在 MySQL 8.0 及以上版本中,可以在表达式或函数结果上创建索引。
•用途: 适用于需要对列的计算结果进行查询的场景。
•语法: CREATE INDEX index_name ON table_name((expression));

索引方法:

B-Tree 索引

•描述: B-Tree 是 MySQL 中最常用的索引方法。B-Tree 索引按顺序存储数据,因此适合范围查询、排序和等值查询。
•使用场景: 适用于大多数普通索引、唯一索引、主键索引和组合索引。
•存储引擎支持: InnoDB、MyISAM。

哈希索引 (Hash Index)

•描述: 基于哈希表实现,适用于等值查询,无法进行范围查询。
•使用场景: 适用于只进行等值查询的场景,不适用于范围查询或排序。
•存储引擎支持: Memory 存储引擎主要使用哈希索引。

全文索引 (Full-Text Index)

•描述: 基于倒排索引实现,适用于全文搜索,可以对文本中的关键词进行高效查找。
•使用场景: 适用于大文本字段的全文检索,如 CHAR、VARCHAR、TEXT 字段。
•存储引擎支持: MyISAM 和 InnoDB 存储引擎。

空间索引 (Spatial Index)

•描述: 基于 R-Tree 实现,专门用于地理空间数据的索引,如 Geometry 数据类型。
•使用场景: 适用于地理信息系统 (GIS) 或其他需要存储和查询空间数据的场景。
•存储引擎支持: MyISAM 存储引擎。

倒排索引 (Inverted Index)

•描述: 用于全文搜索,通过维护文档中词与文档位置的对应关系加速文本查找。
•使用场景: 适用于全文搜索系统,如 FULLTEXT 索引的底层实现。
•存储引擎支持: MyISAM 和 InnoDB。

总结

•索引类型: 描述了索引的用途(如普通索引、唯一索引、全文索引等)。
•索引方法: 描述了底层如何实现索引(如 B-Tree、Hash、R-Tree、倒排索引等)。
在应用中,选择合适的索引类型和索引方法对于优化查询性能非常关键。了解两者的区别和使用场景有助于设计高效的数据库结构。

如果这篇文章对你有用,可以关注本人微信公众号获取更多ヽ(^ω^)ノ ~

Myslq索引对千万级数据量查询的影响_MySQL_04