当前位置: 首页 > news >正文

Innodb的索引结构和MyISAM有区别吗

InnoDB 和 MyISAM 是 MySQL 中的两种存储引擎,它们在索引结构上确实有很大的区别。下面是它们之间的关键区别,以及一些代码示例来展示它们的不同。

1. 索引结构的区别:

InnoDB 的索引结构:
  • 聚簇索引 (Clustered Index):InnoDB 使用的是聚簇索引(Clustered Index),即数据表中的数据和索引是存储在一起的。数据按主键顺序存储,每个表最多只能有一个聚簇索引。聚簇索引的叶子节点存储的是数据本身。
  • 辅助索引 (Secondary Index):除了主键索引外,InnoDB 还支持辅助索引。辅助索引的叶子节点存储的是主键值,而不是数据行的内容。当使用辅助索引时,查询会根据主键值进行回表查询,获取数据。
MyISAM 的索引结构:
  • 非聚簇索引 (Non-clustered Index):MyISAM 使用的是非聚簇索引(Non-clustered Index)。数据和索引是分开存储的。每个索引都有一个单独的索引文件,索引的叶子节点存储的是数据行的地址(即指针),通过这个指针可以找到数据。

2. 代码示例:

假设我们有一个名为 users 的表,该表包含 id(主键)、nameage 三个字段。

创建 InnoDB 表:
CREATE TABLE users_innodb (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    age INT,
    KEY idx_name (name)
) ENGINE=InnoDB;
  • 在 InnoDB 中,id 是主键,表的数据按照主键顺序存储。索引 idx_name 是一个非聚簇索引(辅助索引),其叶子节点保存的是主键值(而不是行数据),因此查询会先查找索引,然后通过主键回表查找数据。
创建 MyISAM 表:
CREATE TABLE users_myisam (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    age INT,
    KEY idx_name (name)
) ENGINE=MyISAM;
  • 在 MyISAM 中,索引和数据是分开存储的。id 是主键,idx_name 是非聚簇索引,索引的叶子节点存储的是数据的地址。查询时,首先根据 idx_name 查找索引,再根据索引中的地址找到对应的数据行。

3. 查询对比:

假设我们查询 nameJohn 的记录。

InnoDB 查询:
EXPLAIN SELECT * FROM users_innodb WHERE name = 'John';

在 InnoDB 中,查询会先通过 idx_name 辅助索引找到 name = 'John' 的主键值,然后通过主键回表找到完整的数据行。

MyISAM 查询:
EXPLAIN SELECT * FROM users_myisam WHERE name = 'John';

在 MyISAM 中,查询会通过 idx_name 索引直接找到数据行的地址,不需要回表,因为数据和索引存储是分开的。

4. 总结:

  • InnoDB:
    • 使用聚簇索引,数据存储在主键索引中。
    • 支持辅助索引,叶子节点存储的是主键值(需要回表查询)。
    • 支持事务、ACID 等特性。
  • MyISAM:
    • 使用非聚簇索引,数据和索引是分开的。
    • 查询时可以直接通过索引找到数据。
    • 不支持事务,但在某些读密集型应用中性能更好。

通过对比代码和查询,我们可以看到 InnoDB 和 MyISAM 在索引结构上的不同,这也是两者性能和适用场景上的重要区别。

相关文章:

  • 哪些企业需要做Ecovadis认证?
  • PCIE Spec ---Software Initialization and Configuration(二)
  • 计算机网络基础:认识网络硬件与传输介质
  • 【MATLAB例程】三维环境下,动态轨迹的AOA定位与UKF滤波,模拟IMU/AOA的数据融合,附完整代码
  • Grounding DINO: 将DINO与接地预训练结合用于开放集目标检测
  • Umi从零搭建Ant Design Pro项目(2)
  • 每日一题----------文件流(创建文件方式三种)
  • 优化器/模型参数/超参数
  • Python生成requirements.txt的两种方法
  • 【数据分析】数据筛选(布尔索引:多个判断条件)
  • RHCE综合实验
  • LS-NET-004-简单二层环路解决(华为锐捷思科)
  • kotlin @JvmStatic的使用
  • 【C++】STL(1) - 序列容器
  • 在C#的MVC框架framework项目的使用ajax,及源码下载
  • 织梦DedeCMS后台发布文章增加“顶”和“踩”默认随机值,并可后台修改
  • [Windows] OfficeAI 助手 v0.3.20(长期免费,本地支持WPS/Word联动)
  • Java多线程与高并发专题——在 Thread 中多个 ThreadLocal 是怎么存储的?
  • langgraph简单Demo(使用langserve实现外部调用)
  • 解码软件需求的三个维度:从满足基础到创造惊喜
  • 科技部等七部门:优先支持取得关键核心技术突破的科技型企业上市融资
  • 男子不满和睦家医院手术效果还遇到了“冒牌医生”?院方回应
  • 人民日报任平:从汽车产销、外贸大盘看中国经济前景
  • 6连败后再战萨巴伦卡,郑钦文期待打出更稳定发挥
  • 事关心脏健康安全,经导管植入式人工心脏瓣膜国家标准发布
  • 第二期人工智能能力建设研讨班在京开班,近40国和区域组织代表参加