在 MySQL(InnoDB)数据库中,索引的底层数据结构主要包括 B+树、哈希索引、全文索引 和 R-Tree。其中,B+树 是最常见的索引结构,适用于大多数查询场景。


1. B+ 树索引(B+Tree Index)

(1)特点

  • 多层平衡树结构,所有数据存储在叶子节点。
  • 叶子节点按顺序存储,支持范围查询和排序。
  • 非叶子节点只存储键值,不存储具体数据,减少磁盘 I/O。
  • 自带排序,适合 ORDER BY、BETWEEN 等查询。

(2)示例

假设有一张证券交易流水表 (trades),trade_date 字段建立了 B+ 树索引:

CREATE INDEX idx_trade_date ON trades(trade_date);

当执行查询:

SELECT * FROM trades WHERE trade_date BETWEEN '2023-01-01' AND '2024-01-01';

MySQL 直接在 B+ 树索引中找到第一个匹配的叶子节点,然后顺序扫描,避免全表扫描,提高查询性能。


2. 哈希索引(Hash Index)

(1)特点

  • 基于哈希表,只适用于等值查询(=)。
  • 不支持范围查询(如 BETWEEN)、排序(如 ORDER BY)。
  • 适用于 查询速度极快但数据更新不频繁的场景。

(2)示例

对于用户登录验证:

CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL,
    password_hash CHAR(64) NOT NULL,
    UNIQUE KEY idx_username (username) USING HASH
);

执行:

SELECT * FROM users WHERE username = 'zhangsan';

MySQL 通过哈希函数快速计算 username 的存储位置,直接找到匹配记录。

适用场景:用户 ID、唯一键(UUID)、哈希匹配等。


3. 全文索引(FULLTEXT Index)

(1)特点

  • 用于大文本字段(如 VARCHAR、TEXT)。
  • 适用于模糊匹配、搜索引擎。
  • 支持倒排索引,比 LIKE 查询更高效。

(2)示例

在文章内容字段上创建全文索引:

CREATE FULLTEXT INDEX idx_content ON articles(content);

查询包含“证券交易”相关内容的文章:

SELECT * FROM articles WHERE MATCH(content) AGAINST ('证券交易');

适用场景:新闻搜索、电商商品搜索、证券公告查询等。


4. R-Tree 索引(用于空间索引)

(1)特点

  • 用于地理位置查询,支持 GIS(地理信息系统)。
  • 适用于范围查询,如“查找某个区域内的证券交易所”。

(2)示例

在地理位置信息表上建立 R-Tree 索引:

CREATE SPATIAL INDEX idx_location ON locations(geo_point);

查询特定范围内的证券交易所:

SELECT * FROM locations 
WHERE ST_Contains(ST_GeomFromText('POLYGON(...)'), geo_point);

适用场景:地图查询、地理数据分析、城市分布统计。


5. 索引结构对比

在证券交易系统中,B+ 树索引是最常用的结构,适用于交易流水、账户信息等数据查询。你们的系统目前主要使用哪种索引?遇到了哪些查询优化问题?

 

更多推荐