基础知识3

news/2025/2/25 12:00:22

文章目录

  • MySQL的执行引擎有哪些?
      • 1. **InnoDB**
      • 2. **MyISAM**
      • 3. **Memory**
      • 4. **Archive**
      • 5. **CSV**
      • 6. **Blackhole**
      • 7. **Federated**
      • 8. **NDB Cluster**
      • 9. **其他存储引擎**
      • 总结
  • MySQL为什么使用B+树来作索引
      • 1. **InnoDB**
      • 2. **MyISAM**
      • 3. **Memory**
      • 4. **Archive**
      • 5. **CSV**
      • 6. **Blackhole**
      • 7. **Federated**
      • 8. **NDB Cluster**
      • 9. **其他存储引擎**
      • 总结
  • 说一下索引失效的场景?
      • 1. **查询条件中使用了函数或表达式**
        • 示例:
      • 2. **使用了 `OR` 条件**
        • 示例:
      • 3. **索引列上使用了 `%` 或 `_` 的模糊查询**
        • 示例:
      • 4. **查询条件中使用了不等式(`<`, `>`, `!=`)**
        • 示例:
      • 5. **索引列的数据类型不匹配**
        • 示例:
      • 6. **索引列上使用了 `IS NULL` 或 `IS NOT NULL`**
        • 示例:
      • 7. **查询条件中使用了 `NOT` 或 `<>`**
        • 示例:
      • 8. **查询条件中涉及多个列,但没有使用复合索引**
        • 示例:
      • 9. **查询返回大量数据**
        • 示例:
      • 10. **索引列的基数过低**
        • 示例:
      • 11. **MySQL 的优化器认为全表扫描更高效**
        • 示例:
      • 12. **索引列上有大量重复值**
        • 示例:
      • 总结


MySQL的执行引擎有哪些?

在 MySQL 中,执行引擎通常指的是存储引擎(Storage Engine)。存储引擎是 MySQL 数据库的核心组件,负责数据的存储、检索和管理。MySQL 支持多种存储引擎,每种引擎都有其特点和适用场景。以下是 MySQL 中常见的存储引擎:

1. InnoDB

  • 特点
    • 支持事务(ACID)、行级锁和外键。
    • 提供高性能的事务处理能力,适合高并发场景。
    • 内置了崩溃恢复机制,数据安全性高。
  • 适用场景
    • 需要事务支持的应用,如金融系统、电商平台。
    • 高并发读写场景,如大型网站的后端数据库。

2. MyISAM

  • 特点
    • 不支持事务,采用表级锁。
    • 读操作性能高,适合以读为主的应用。
    • 全文索引支持,适合搜索引擎等全文检索场景。
  • 适用场景
    • 数据库以读操作为主,对事务要求不高的场景。
    • 需要全文索引的应用,如内容管理系统(CMS)。

3. Memory

  • 特点
    • 数据存储在内存中,读写速度快。
    • 不支持事务,数据在数据库重启后会丢失。
  • 适用场景
    • 需要快速读写临时数据的场景,如缓存表、临时查询结果存储。

4. Archive

  • 特点
    • 专为存储大量不常更新的记录而设计。
    • 支持行级锁,压缩率高,占用空间小。
    • 不支持索引,查询性能较差。
  • 适用场景
    • 日志存储、审计记录等场景,数据量大但查询较少。

5. CSV

  • 特点
    • 将数据存储为 CSV 文件格式,便于与其他应用程序共享。
    • 不支持索引和事务。
  • 适用场景
    • 数据导入导出、与其他系统交互的场景。

6. Blackhole

  • 特点
    • 数据写入后不会存储,类似于“黑洞”。
    • 可用于日志记录或触发器测试。
  • 适用场景
    • 测试触发器、日志记录等场景,不关心数据存储。

7. Federated

  • 特点
    • 允许访问远程 MySQL 数据库中的表,如同本地表一样操作。
    • 不支持事务,性能受限于网络。
  • 适用场景
    • 分布式数据库环境,需要访问远程数据。

8. NDB Cluster

  • 特点
    • 支持分布式存储,高可用性和高并发。
    • 支持事务,采用行级锁。
  • 适用场景
    • 需要高可用性和分布式存储的场景,如电信级应用。

9. 其他存储引擎

MySQL 还支持一些第三方存储引擎,如 XtraDB(InnoDB 的增强版)、MariaDBAria 等。这些引擎通常是为了优化特定场景的性能或功能而设计。

总结

MySQL 的存储引擎种类丰富,每种引擎都有其独特的优势和适用场景。在实际应用中,选择合适的存储引擎需要根据业务需求、数据特点和性能要求来决定。例如:

  • 如果需要事务支持和高并发处理,推荐使用 InnoDB
  • 如果以读操作为主且对事务要求不高,可以选择 MyISAM
  • 对于临时数据存储,Memory 是一个不错的选择。

MySQL为什么使用B+树来作索引

在 MySQL 中,执行引擎通常指的是存储引擎(Storage Engine)。存储引擎是 MySQL 数据库的核心组件,负责数据的存储、检索和管理。MySQL 支持多种存储引擎,每种引擎都有其特点和适用场景。以下是 MySQL 中常见的存储引擎:

1. InnoDB

  • 特点
    • 支持事务(ACID)、行级锁和外键。
    • 提供高性能的事务处理能力,适合高并发场景。
    • 内置了崩溃恢复机制,数据安全性高。
  • 适用场景
    • 需要事务支持的应用,如金融系统、电商平台。
    • 高并发读写场景,如大型网站的后端数据库。

2. MyISAM

  • 特点
    • 不支持事务,采用表级锁。
    • 读操作性能高,适合以读为主的应用。
    • 全文索引支持,适合搜索引擎等全文检索场景。
  • 适用场景
    • 数据库以读操作为主,对事务要求不高的场景。
    • 需要全文索引的应用,如内容管理系统(CMS)。

3. Memory

  • 特点
    • 数据存储在内存中,读写速度快。
    • 不支持事务,数据在数据库重启后会丢失。
  • 适用场景
    • 需要快速读写临时数据的场景,如缓存表、临时查询结果存储。

4. Archive

  • 特点
    • 专为存储大量不常更新的记录而设计。
    • 支持行级锁,压缩率高,占用空间小。
    • 不支持索引,查询性能较差。
  • 适用场景
    • 日志存储、审计记录等场景,数据量大但查询较少。

5. CSV

  • 特点
    • 将数据存储为 CSV 文件格式,便于与其他应用程序共享。
    • 不支持索引和事务。
  • 适用场景
    • 数据导入导出、与其他系统交互的场景。

6. Blackhole

  • 特点
    • 数据写入后不会存储,类似于“黑洞”。
    • 可用于日志记录或触发器测试。
  • 适用场景
    • 测试触发器、日志记录等场景,不关心数据存储。

7. Federated

  • 特点
    • 允许访问远程 MySQL 数据库中的表,如同本地表一样操作。
    • 不支持事务,性能受限于网络。
  • 适用场景
    • 分布式数据库环境,需要访问远程数据。

8. NDB Cluster

  • 特点
    • 支持分布式存储,高可用性和高并发。
    • 支持事务,采用行级锁。
  • 适用场景
    • 需要高可用性和分布式存储的场景,如电信级应用。

9. 其他存储引擎

MySQL 还支持一些第三方存储引擎,如 XtraDB(InnoDB 的增强版)、MariaDBAria 等。这些引擎通常是为了优化特定场景的性能或功能而设计。

总结

MySQL 的存储引擎种类丰富,每种引擎都有其独特的优势和适用场景。在实际应用中,选择合适的存储引擎需要根据业务需求、数据特点和性能要求来决定。例如:

  • 如果需要事务支持和高并发处理,推荐使用 InnoDB
  • 如果以读操作为主且对事务要求不高,可以选择 MyISAM
  • 对于临时数据存储,Memory 是一个不错的选择。

面试中,除了了解这些存储引擎和的特点适用场景,还可以进一步讨论它们的内部实现原理、性能优化方法以及如何根据业务需求选择合适的存储引擎。

说一下索引失效的场景?

在数据库查询中,索引失效是指数据库引擎没有使用索引进行查询优化,而是选择了全表扫描(Full Table Scan)或其他低效的查询方式。索引失效可能导致查询性能大幅下降,尤其是在处理大规模数据时。以下是常见的索引失效场景及其原因:

1. 查询条件中使用了函数或表达式

如果在查询条件中对索引列使用了函数或表达式,MySQL 通常会放弃使用索引,因为函数或表达式会改变列的原始值,导致索引失效。

示例:
sql">SELECT * FROM users WHERE YEAR(birthdate) = 1990;
  • 原因YEAR(birthdate) 是一个函数,MySQL 无法直接利用 birthdate 列上的索引。
  • 解决方案:避免在查询条件中使用函数,改写为:
    sql">SELECT * FROM users WHERE birthdate BETWEEN '1990-01-01' AND '1990-12-31';
    

2. 使用了 OR 条件

当查询条件中包含多个 OR 条件时,MySQL 可能会放弃使用索引,尤其是当这些条件涉及不同列时。

示例:
sql">SELECT * FROM users WHERE name = 'Alice' OR age = 25;
  • 原因OR 条件可能导致 MySQL 无法同时利用 nameage 列上的索引。
  • 解决方案
    • 使用 IN 替代多个 OR 条件(如果条件涉及同一列):
      sql">SELECT * FROM users WHERE name IN ('Alice', 'Bob');
      
    • 使用 UNION 将查询拆分为多个子查询:
      sql">SELECT * FROM users WHERE name = 'Alice'
      UNION
      SELECT * FROM users WHERE age = 25;
      

3. 索引列上使用了 %_ 的模糊查询

当使用 LIKE 进行模糊查询时,如果模式以 %_ 开头,索引通常会失效。

示例:
sql">SELECT * FROM users WHERE username LIKE '%alice%';
  • 原因:以 % 开头的模式无法利用索引的有序性,MySQL 无法快速定位匹配的记录。
  • 解决方案
    • 如果必须使用模糊查询,尽量将 % 放在模式的末尾:
      sql">SELECT * FROM users WHERE username LIKE 'alice%';
      
    • 使用全文索引(Full-Text Index)替代模糊查询。

4. 查询条件中使用了不等式(<, >, !=

虽然不等式查询可以利用索引,但如果查询条件过于复杂,MySQL 可能会选择全表扫描。

示例:
sql">SELECT * FROM users WHERE age > 25 AND age < 30;
  • 原因:不等式查询可能导致 MySQL 无法高效利用索引,尤其是当涉及多个条件时。
  • 解决方案
    • 确保索引列的顺序与查询条件一致。
    • 使用 EXPLAIN 分析查询计划,确保 MySQL 使用了索引。

5. 索引列的数据类型不匹配

如果查询条件中的数据类型与索引列的数据类型不一致,MySQL 可能会放弃使用索引。

示例:
sql">SELECT * FROM users WHERE age = '25';  -- age 是整数类型
  • 原因:查询条件中的 '25' 是字符串类型,而 age 列是整数类型,MySQL 需要进行隐式类型转换。
  • 解决方案:确保查询条件中的数据类型与索引列一致:
    sql">SELECT * FROM users WHERE age = 25;
    

6. 索引列上使用了 IS NULLIS NOT NULL

虽然 IS NULLIS NOT NULL 条件可以利用索引,但在某些情况下,MySQL 可能会选择全表扫描。

示例:
sql">SELECT * FROM users WHERE email IS NULL;
  • 原因NULL 值在索引中可能不被存储,或者 MySQL 认为全表扫描更高效。
  • 解决方案
    • 确保索引列上有大量非 NULL 值。
    • 使用 EXPLAIN 分析查询计划,确保 MySQL 使用了索引。

7. 查询条件中使用了 NOT<>

NOT<>(不等于)条件可能导致索引失效,因为它们无法利用索引的有序性。

示例:
sql">SELECT * FROM users WHERE age <> 25;
  • 原因<> 条件需要扫描所有不满足条件的记录,MySQL 可能会放弃使用索引。
  • 解决方案
    • 如果可能,将查询条件拆分为多个子查询:
      sql">SELECT * FROM users WHERE age < 25 OR age > 25;
      

8. 查询条件中涉及多个列,但没有使用复合索引

如果查询条件涉及多个列,但没有为这些列创建复合索引,MySQL 可能会放弃使用单列索引。

示例:
sql">SELECT * FROM users WHERE age = 25 AND gender = 'M';
  • 原因:没有为 (age, gender) 创建复合索引,MySQL 可能会选择全表扫描。
  • 解决方案
    • 创建复合索引:
      sql">CREATE INDEX idx_age_gender ON users(age, gender);
      

9. 查询返回大量数据

如果查询返回的数据量接近表的总行数,MySQL 可能会认为全表扫描更高效,从而放弃使用索引。

示例:
sql">SELECT * FROM users WHERE age > 18;  -- 假设大部分用户年龄大于 18
  • 原因:返回的数据量太大,索引的性能优势不明显。
  • 解决方案
    • 优化查询条件,减少返回的数据量。
    • 使用覆盖索引(Covering Index),只返回索引列中的数据。

10. 索引列的基数过低

如果索引列的基数(即不同值的数量)过低,MySQL 可能会认为索引的区分度不够,从而放弃使用索引。

示例:
sql">SELECT * FROM users WHERE gender = 'M';
  • 原因gender 列只有两个值(MF),索引的区分度低。
  • 解决方案
    • 避免为基数低的列创建索引。
    • 如果必须使用索引,可以考虑使用复合索引。

11. MySQL 的优化器认为全表扫描更高效

MySQL 的查询优化器会根据统计信息(如表的大小、索引的分布等)选择查询计划。如果优化器认为全表扫描比使用索引更高效,它可能会放弃使用索引。

示例:
sql">SELECT * FROM users WHERE age > 18;
  • 原因:优化器根据统计信息认为全表扫描更高效。
  • 解决方案
    • 使用 EXPLAIN 分析查询计划,了解优化器的选择。
    • 更新表的统计信息:
      sql">ANALYZE TABLE users;
      
    • 强制使用索引:
      sql">SELECT * FROM users USE INDEX (idx_age) WHERE age > 18;
      

12. 索引列上有大量重复值

如果索引列上有大量重复值,MySQL 可能会认为索引的区分度不够,从而放弃使用索引。

示例:
sql">SELECT * FROM users WHERE country = 'China';
  • 原因country 列可能有大量的重复值,索引的区分度低。
  • 解决方案
    • 避免为重复值过多的列创建索引。
    • 使用复合索引,结合其他列提高区分度。

总结

索引失效的原因多种多样,主要包括查询条件的写法、数据类型不匹配、查询优化器的选择等。为了避免索引失效,可以采取以下措施:

  1. 编写合理的查询条件,避免使用函数、表达式或模糊查询。
  2. 为查询条件涉及的列创建合适的索引(如复合索引)。
  3. 使用 EXPLAIN 分析查询计划,确保 MySQL 使用了索引。
  4. 定期更新表的统计信息,帮助优化器做出更合理的决策。
  5. 避免为基数低或重复值过多的列创建索引。

在实际开发中,理解索引失效的原因并掌握优化方法,可以显著提升数据库查询性能。


http://www.niftyadmin.cn/n/5865471.html

相关文章

Threejs教程三【揭秘3D贴图魔法】

定义 贴图&#xff08;Texture&#xff09;是 Three.js 中用于为物体表面添加纹理的一种技术。它可以将图像、视频或其他类型的媒体映射到物体的表面&#xff0c;使其看起来更加真实和生动。 基本原理 贴图的基本原理是将图像或视频映射到物体的表面&#xff0c;使其看起来更…

[java基础-JVM篇]3_JVM类加载机制

摘要&#xff1a;JVM通过设立不同优先级和职责的加载器保证了类加载的安全性与灵活性&#xff0c;即双亲委派机制&#xff0c;但是实际生产中更复杂的需求又需要破坏双亲委派&#xff0c;即打破JVM约定过的类加载程序 目录 类的生命周期 类加载 加载 类加载器 双亲委派机制…

EX_25/2/22

找到第一天mystring练习&#xff0c;实现以下功能 mystring str "hello" mystring ptr "world" str str ptr; str ptr str[0] H #include <iostream> #include <cstring> #include <cstdlib> #include <unistd.h> #in…

JMeter性能问题

性能测试中TPS上不去的几种原因 性能测试中TPS上不去的几种原因_tps一直上不去-CSDN博客 网络带宽 连接池 垃圾回收机制 压测脚本 通信连接机制 数据库配置 硬件资源 压测机 业务逻辑 系统架构 CPU过高什么原因 性能问题分析-CPU偏高 - 西瓜汁拌面 - 博客园 US C…

选择排序:简单高效的选择

大家好&#xff0c;今天我们来聊聊选择排序&#xff08;Selection Sort&#xff09;算法。这是一个非常简单的排序算法&#xff0c;适合用来学习排序的基本思路和操作。选择排序在许多排序算法中以其直观和易于实现的特点著称&#xff0c;虽然它的效率不如其他高效算法&#xf…

在arm64设备(树莓派4B)上部署Hyperledger Fabric V2.5

arm64设备相较于x86设备功耗低、硬件成本低,树莓派4B是一个流行的arm64设备,本文记录在树莓派4B中部署Hyperledger Fabric V2.5的关键点,即与x86架构启动网络所需材料的差异。 成功部署示例 如图所示,Hyperledger Fabric V2.5.6 成功运行在了树莓派4B(8G内存版)中,即te…

奇异值分解(SVD)拟合平面

奇异值分解&#xff08;SVD&#xff09;拟合平面 在三维空间中&#xff0c;使用奇异值分解&#xff08;SVD&#xff09;来拟合平面是一种常见且有效的方法。下面将详细介绍其原理、实现步骤&#xff0c;并给出Python代码示例。 原理 给定一组三维空间中的点 P { p 1 , p 2…

【无标题】PHP-get_definde_vars

[题目信息]&#xff1a; 题目名称题目难度PHP-get_defined_vars2 [题目考点]&#xff1a; get_defined_vars — 返回由所有已定义变量所组成的数组此函数返回一个包含所有已定义变量列表的多维数组&#xff0c;这些变量包括环境变量、服务器变量和用户定义的变量。 [Flag格式…