【MySQL 进阶之路】了解 性能优化 与 设计原则

1.B+树的优势

"矮胖"结构

  • :B+树的每个节点存储更多的关键字,从而减少了树的层级(最多三层),减少了磁盘I/O操作,提高了查询效率。
  • :叶子节点存储实际的数据,并使用双向链表连接。支持高效的顺序访问和范围查询。

优势

  1. 查询性能稳定
    • 在B+树中,所有查询都必须从根节点逐层经过子节点,最终到达叶子节点,保证了查询路径的稳定性。
  2. 支持范围查询
    • B+树的叶子节点形成了有序的双向链表,使得范围查询非常高效。通过链表的顺序访问,B+树能够快速遍历满足条件的数据,从而大大提高了范围查询的效率。

2.什么是最左前缀原则,为什么要有最左前缀原则?

最左前缀原则(Leftmost Prefix Principle) 是一种在解析和匹配字符串的过程中常用的策略,尤其在某些算法和形式语言理论中非常重要。

递归下降解析:语法解析中,如果有多个规则可以匹配,解析器优先选择第一个(最左边的)规则进行匹配。

正则表达式匹配: 默认会选择最左侧的匹配结果

推理引擎:在一些推理问题中,都按照最左侧路径进行处理。

为什么要有最左前缀原则?

  1. 优化查询性能
    最左前缀原则能帮助数据库优化查询。当查询条件包含索引的前缀列时,数据库能通过索引快速定位数据,从而避免全表扫描,提高查询效率。如果查询条件没有按照索引列的顺序排列,则数据库无法完全利用该复合索引,可能导致性能下降。
  2. 提高索引命中率
    索引的顺序决定了查询条件能否高效使用索引。如果查询条件的列顺序不符合复合索引的最左前缀顺序,数据库可能无法使用索引的部分或者全部列,从而影响查询的性能。
  3. 减少不必要的扫描
    按照最左前缀原则,查询能够在索引的前缀部分直接找到匹配的行,减少对整个数据表的扫描。如果索引列顺序不匹配,可能会导致数据库无法使用索引或只能使用部分索引,增加了不必要的数据扫描。

3.什么是索引覆盖?为什么要有索引覆盖?

索引覆盖(Index Covering)指的是数据库查询时,所有需要的数据都可以从索引中直接获取,而不需要访问表中的实际数据行。也就是说,查询的字段完全由索引提供。

为什么要有索引覆盖?

  1. 提升查询效率:避免回表操作(不需要访问实际数据行),减少I/O开销,提高查询速度。
  2. 减少资源消耗:通过索引直接获取数据,减少磁盘和内存的使用,节省系统资源。
  3. 提高响应速度:特别是在大数据量环境下,覆盖索引能显著减少查询时间,提升系统响应性能。

4.MySQL 中的 AUTO_INCREMENT 是如何工作的?

AUTO_INCREMENT 是 MySQL 中一种用于自动生成唯一值的属性,常用于表中的主键列。每当插入新记录时,MySQL 会自动为该列生成一个递增的唯一整数值。

工作原理:

  • AUTO_INCREMENT 值从 1 开始递增(默认情况下),每插入一行记录,值就会自动加 1。
  • AUTO_INCREMENT 的值是线程安全的,可以保证在多个用户同时插入数据时,不会产生重复的值。
  • 可以通过 ALTER TABLE 修改 AUTO_INCREMENT 的起始值或步长。
  • 在删除记录后,AUTO_INCREMENT 的值不会自动回收,如果希望重新利用删除的 ID 值,需要手动设置。

5.什么是数据库的范式(Normalization)?为什么需要规范化设计?

数据库范式是对数据库结构进行规范化的过程,目的是减少冗余数据,避免更新异常,保证数据的一致性。常见的范式有以下几种:

  • 第一范式(1NF)
    关系数据库中的每一列必须包含原子值,即每个字段只能存储一个值,不允许有重复的列或表。
  • 第二范式(2NF)
    在 1NF 的基础上,要求表中的每个非主键列必须完全依赖于主键,避免部分依赖。主要解决了第一范式中可能存在的冗余数据问题。
  • 第三范式(3NF)
    在 2NF 的基础上,要求表中不存在非主键字段对其他非主键字段的依赖,即消除传递依赖。
  • BCNF(博茨-科德范式)
    在 3NF 的基础上,进一步要求每个决定因素都是候选键。
  • 第四范式(4NF)
    消除多值依赖,确保没有两个以上的独立多值依赖存在。

规范化设计的优点:

  • 减少数据冗余:通过拆分表格和避免数据重复,节省存储空间。
  • 提高数据一致性:避免数据不一致的情况,减少数据更新异常。
  • 优化数据修改:数据修改只需要在一个地方进行,减少数据维护的复杂性。

6. 如何优化数据库查询性能?

优化数据库查询性能可以从多个方面入手,以下是一些常见的优化手段:

  • 创建适当的索引
    根据查询的需求,创建索引可以显著提高查询速度,尤其是对于 WHERE 子句、JOIN 条件、ORDER BY 等经常使用的列。然而,过多的索引会影响插入、删除和更新操作的性能。
  • 避免 SELECT * 查询
    使用 SELECT * 会选择所有列,查询性能会受到影响。建议只查询需要的字段。
  • 使用查询缓存
    对于重复查询的场景,开启查询缓存(在 MySQL 中是 query_cache)可以减少数据库的负担,返回缓存的查询结果。
  • 避免在 WHERE 子句中使用函数
    WHERE 子句中使用函数(例如 LOWER(column))会使索引失效,导致全表扫描。尽量避免这种写法。
  • 分页查询优化
    对于需要分页的查询,尤其是数据量较大的表,使用 LIMITOFFSET 时,可能会导致性能问题。优化分页查询可以考虑使用基于索引的查询(如 WHERE id > last_id)来避免性能下降。
  • 合理使用 JOIN 类型
    根据数据表的大小和查询需求,选择合适的 JOIN 类型。如果只需要左表中的记录,可以使用 LEFT JOIN,避免不必要的 INNER JOIN
  • 避免 N+1 查询问题
    当需要获取多个表的关联数据时,要避免产生过多的查询。可以使用 JOIN 来一次性获取所需数据,避免多次查询带来的性能问题。
  • 合理设计数据表
    将数据表拆分成合适的子表,以减少单表的数据量。合理的表结构设计可以显著提高查询和存储效率。
  • 使用合适的存储引擎
    MySQL 提供了多种存储引擎,如 InnoDB 和 MyISAM。InnoDB 支持事务、行级锁等特性,适用于大部分场景;而 MyISAM 适用于读取密集型操作。
  • 避免锁竞争
    在高并发场景下,锁的竞争可能导致性能瓶颈。可以通过调整事务的隔离级别(如设置为 READ COMMITTED)来减少锁的争用。
相关推荐
不光头强1 小时前
Spring框架的事务管理
数据库·spring·oracle
百***92023 小时前
【MySQL】MySQL库的操作
android·数据库·mysql
q***76663 小时前
Spring Boot 从 2.7.x 升级到 3.3注意事项
数据库·hive·spring boot
信仰_2739932434 小时前
Redis红锁
数据库·redis·缓存
人间打气筒(Ada)4 小时前
Centos7 搭建hadoop2.7.2、hbase伪分布式集群
数据库·分布式·hbase
心灵宝贝4 小时前
如何在 Mac 上安装 MySQL 8.0.20.dmg(从下载到使用全流程)
数据库·mysql·macos
想睡hhh4 小时前
mysql索引——理解索引机制及操作
mysql
剑动山河4 小时前
ubuntu 升级mysql由mysql5.7.42 升级到8.4.0
mysql·ubuntu·adb
奋斗的牛马5 小时前
OFDM理解
网络·数据库·单片机·嵌入式硬件·fpga开发·信息与通信
忧郁的橙子.6 小时前
一、Rabbit MQ 初级
服务器·网络·数据库