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

打印 上一主题 下一主题

主题 907|帖子 907|积分 2721

1.B+树的优势

“矮胖”结构


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

  • 查询性能稳固

    • 在B+树中,所有查询都必须从根节点逐层经过子节点,最终到达叶子节点,包管了查询路径的稳固性。

  • 支持范围查询

    • B+树的叶子节点形成了有序的双向链表,使得范围查询非常高效。通过链表的顺序访问,B+树能够快速遍历满足条件的数据,从而大大提高了范围查询的效率。

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

最左前缀原则(Leftmost Prefix Principle) 是一种在分析和匹配字符串的过程中常用的计谋,尤其在某些算法和情势语言理论中非常重要。
递归降落分析:语法分析中,如果有多个规则可以匹配,分析器优先选择第一个(最左边的)规则进行匹配。
正则表达式匹配: 默认会选择最左侧的匹配结果
推理引擎:在一些推理问题中,都按照最左侧路径进行处置处罚。
为什么要有最左前缀原则?


  • 优化查询性能
    最左前缀原则能帮助数据库优化查询。当查询条件包含索引的前缀列时,数据库能通过索引快速定位数据,从而制止全表扫描,提高查询效率。如果查询条件没有按照索引列的顺序分列,则数据库无法完全使用该复合索引,可能导致性能降落。
  • 提高索引掷中率
    索引的顺序决定了查询条件能否高效使用索引。如果查询条件的列顺序不符合复合索引的最左前缀顺序,数据库可能无法使用索引的部分大概全部列,从而影响查询的性能。
  • 淘汰不必要的扫描
    按照最左前缀原则,查询能够在索引的前缀部分直接找到匹配的行,淘汰对整个数据表的扫描。如果索引列顺序不匹配,可能会导致数据库无法使用索引或只能使用部分索引,增加了不必要的数据扫描。
3.什么是索引覆盖?为什么要有索引覆盖?

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


  • 提拔查询效率:制止回表操作(不必要访问实际数据行),淘汰I/O开销,提高查询速率。
  • 淘汰资源斲丧:通过索引直接获取数据,淘汰磁盘和内存的使用,节流体系资源。
  • 提高响应速率:特殊是在大数据量情况下,覆盖索引能显著淘汰查询时间,提拔体系响应性能。
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))会使索引失效,导致全表扫描。只管制止这种写法。
  • 分页查询优化
    对于必要分页的查询,尤其是数据量较大的表,使用 LIMIT 和 OFFSET 时,可能会导致性能问题。优化分页查询可以考虑使用基于索引的查询(如 WHERE id > last_id)来制止性能降落。
  • 合理使用 JOIN 类型
    根据数据表的大小和查询需求,选择合适的 JOIN 类型。如果只必要左表中的记载,可以使用 LEFT JOIN,制止不必要的 INNER JOIN。
  • 制止 N+1 查扣问题
    当必要获取多个表的关联数据时,要制止产生过多的查询。可以使用 JOIN 来一次性获取所需数据,制止多次查询带来的性能问题。
  • 合理设计数据表
    将数据表拆分成合适的子表,以淘汰单表的数据量。合理的表结构设计可以显著提高查询和存储效率。
  • 使用合适的存储引擎
    MySQL 提供了多种存储引擎,如 InnoDB 和 MyISAM。InnoDB 支持事务、行级锁等特性,适用于大部分场景;而 MyISAM 适用于读取麋集型操作。
  • 制止锁竞争
    在高并发场景下,锁的竞争可能导致性能瓶颈。可以通过调整事务的隔离级别(如设置为 READ COMMITTED)来淘汰锁的争用。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

笑看天下无敌手

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表