首页 > 数据库 >MySQL面试题系列-6

MySQL面试题系列-6

时间:2024-04-04 18:05:03浏览次数:23  
标签:面试题 系列 聚集 查询 索引 MySQL 数据 主键

MySQL是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的RDBMS (Relational Database Management System,关系数据库管理系统)应用软件之一。

数据库的三范式

数据库的三范式是设计关系型数据库时常用的一种规范,它有助于确保数据的一致性和减少数据冗余。三范式分别是:

  1. 第一范式(1NF):属性不可再分
    • 每个字段都是原子性的,即字段不可再分。
    • 例如,一个地址字段应该拆分为街道、城市、省份和邮编等独立的字段。
  2. 第二范式(2NF):完全依赖于主键
    • 满足第一范式的基础上,非主键字段必须完全依赖于主键,而不是部分依赖。
    • 例如,如果有一个订单详情表,其中包含订单ID、产品ID、数量和价格等字段,那么这个表应该满足第二范式,因为所有非主键字段都完全依赖于主键(订单ID和产品ID)。
  3. 第三范式(3NF):消除传递依赖
    • 满足第二范式的基础上,非主键字段之间不能有传递依赖关系。
    • 例如,如果有一个员工表,其中包含员工ID、姓名、部门ID和部门经理ID等字段,那么这个表应该满足第三范式,因为部门经理ID不应该直接依赖于员工ID,而是应该依赖于部门ID。

遵循三范式的数据库设计可以减少数据冗余,提高数据的一致性和可维护性。然而,在实际应用中,为了提高查询性能,有时需要对三范式进行适当的权衡和调整。

Mysql优化建议

MySQL数据库的优化可以从多个角度进行,包括硬件优化、配置优化、结构设计优化、查询优化等。以下是一些常见的MySQL优化建议:

  1. 硬件优化:
    • 增加内存:提高InnoDB缓冲池的大小,以减少磁盘I/O。
    • 使用固态硬盘(SSD):提高数据读写速度。
    • 多核处理器和足够的CPU资源:以支持并行查询处理。
  2. 配置优化:
    • my.cnfmy.ini配置文件调整:根据服务器的硬件资源合理设置InnoDB缓冲池大小、日志文件大小、表空间大小等。
    • 调整线程缓存和连接数:根据服务器的负载情况调整。
  3. 结构设计优化:
    • 规范化表结构:避免冗余数据,但要注意不要过度规范化,以免造成过多的联合查询。
    • 使用合适的数据类型:例如,对于字符串类型的字段,如果长度固定,使用CHARVARCHAR更高效。
    • 分割大表:将大表分割为多个小表,以提高查询效率。
  4. 索引优化:
    • 添加合适的索引:为经常用于查询条件的列创建索引。
    • 删除不必要的索引:避免过多的索引导致写操作变慢和维护成本增加。
    • 使用复合索引:针对多列查询,使用复合索引可以提高查询效率。
  5. 查询优化:
    • 避免SELECT *:只查询需要的列。
    • 使用EXPLAIN分析查询:了解查询执行计划,找出瓶颈。
    • 优化JOIN操作:选择合适的JOIN类型,减少不必要的JOIN。
    • 使用LIMIT分页查询:避免一次性返回大量数据。
  6. 缓存优化:
    • 利用MySQL的查询缓存:对于读取频繁且不经常变动的数据,可以启用查询缓存。
    • 使用外部缓存系统:如Redis,减轻数据库的压力。
  7. 定期维护:
    • 定期运行OPTIMIZE TABLE:整理表碎片,提高性能(仅对MyISAM有效)。
    • 定期检查和优化表:使用CHECK TABLEREPAIR TABLE命令。
  8. 备份与恢复:
    • 定期备份数据库:确保数据安全。
    • 测试恢复流程:确保在紧急情况下能快速恢复数据。
  9. 监控与分析:
    • 使用性能监控工具:如Percona Toolkit、MySQLTuner等,定期检查和分析数据库性能。
  10. 读写分离和负载均衡:
  • 实现主从复制:将读操作分散到从库,减轻主库压力。
  • 使用负载均衡器:在多个数据库服务器之间分配请求。

请注意,这些建议需要根据实际情况进行调整,不同的应用场景可能需要不同的优化策略。在进行任何重大更改之前,最好在测试环境中进行充分的测试。

Mysql聚集索引

在MySQL中,聚集索引(Clustered Index)是指索引的一种类型,它决定了数据行的物理存储顺序。每个InnoDB表都有一个主键,而这个主键的索引就是聚集索引。聚集索引的叶节点包含了完整的数据行,而非叶节点则包含指向子节点的指针。
以下是一些关于MySQL聚集索引的重要特点:

  1. 数据行存储顺序:数据行按照聚集索引的顺序存储在磁盘上,这意味着聚集索引决定了数据的物理存储方式。
  2. 主键作为聚集索引:如果表定义了主键,那么主键就是该表的聚集索引。如果没有显式定义主键,InnoDB会选择一个唯一非空索引作为聚集索引,如果也没有这样的索引,InnoDB会隐式地生成一个名为GEN_CLUST_INDEX的自动递增列作为聚集索引。
  3. 叶节点包含数据行:在聚集索引中,叶节点包含了完整的数据行信息,而不仅仅是索引列。这意味着查询时,如果只需要访问索引列,就不需要再单独去查找数据行。
  4. 一张表只有一个聚集索引:由于聚集索引决定了数据的物理存储方式,因此每张表只能有一个聚集索引。这也是为什么InnoDB表的主键只能有一个的原因。
  5. 辅助索引(二级索引):除了聚集索引之外,其他的所有索引都称为辅助索引或二级索引。辅助索引的叶节点包含的是指向相应数据行的指针,而不是数据行本身。当查询使用辅助索引时,InnoDB会先查找辅助索引,然后通过指针找到聚集索引中的完整数据行。
  6. 插入优化:由于聚集索引决定了数据的物理存储顺序,新插入的数据行通常会被放置在已有数据行的末尾。如果新插入的数据行需要放在中间位置,可能会导致大量的数据移动,影响性能。

了解聚集索引的特点对于数据库设计和查询优化非常重要。例如,合理地选择主键可以使得常用的查询更加高效,因为聚集索引能够直接影响到数据行的访问速度。

Mysql的非聚集索引

在MySQL中,非聚集索引(Non-Clustered Index)也被称为二级索引或辅助索引。与聚集索引不同,非聚集索引并不决定数据行的物理存储顺序,而是包含指向数据行的指针。每条索引记录都包含了一个指向实际数据行的地址,以及索引列的值。
以下是一些关于MySQL非聚集索引的重要特点:

  1. 独立于数据行存储:非聚集索引的叶节点包含了指向数据行的指针,而不是数据行本身。这意味着非聚集索引的结构和数据行的物理存储是独立的。
  2. 可以有多个:与聚集索引不同,一张表可以有多个非聚集索引。这是因为非聚集索引不决定数据行的物理存储方式,所以可以为不同的列创建多个索引以提高查询效率。
  3. 访问路径:当查询使用非聚集索引时,InnoDB会先查找非聚集索引,然后通过指针找到聚集索引中的完整数据行。如果查询只需要访问索引列,就不需要再访问数据行。
  4. 覆盖索引:如果查询只需要访问非聚集索引中的列,而不需要访问数据行中的其他列,这种情况被称为覆盖索引(Covering Index)。覆盖索引可以提高查询效率,因为不需要访问数据行。
  5. 插入优化:由于非聚集索引不直接影响数据行的物理存储顺序,新插入的数据行对非聚集索引的影响通常比对聚集索引小。这意味着在某些情况下,插入操作可能会更快。
  6. 维护成本:每个非聚集索引都需要额外的存储空间,并且在插入、更新和删除操作时需要维护。因此,过多的非聚集索引可能会增加写操作的开销。

了解非聚集索引的特点对于数据库设计和查询优化非常重要。合理地选择和使用非聚集索引可以提高查询性能,但同时也要注意不要过度使用,以免增加写操作的负担和维护成本。

MySql的回表查询是什么?

在MySQL中,“回表查询”(Lookup Query)是指在执行查询时,首先通过非聚集索引(二级索引)定位到数据行的位置,然后再回到数据表中获取完整的数据行的过程。这个过程通常发生在使用覆盖索引无法满足查询需求时,即查询需要的列不完全包含在非聚集索引中。
以下是回表查询的基本步骤:

  1. 使用非聚集索引:查询首先使用非聚集索引来快速定位到数据行的位置。非聚集索引的叶节点包含了指向数据行的指针。
  2. 查找数据行:通过非聚集索引找到的指针,查询然后回到数据表中获取完整的数据行。这个步骤被称为"回表",因为查询从索引回到了数据表。
  3. 获取所需数据:一旦找到了数据行,查询就可以从中获取所需的所有列。

回表查询的效率取决于两个主要因素:

  • 索引的选择:如果非聚集索引能够有效地过滤掉不需要的数据行,那么需要回表的数据行数量就会大大减少,从而提高查询效率。
  • 数据页的加载:如果需要回表的数据行位于同一个数据页中,那么这个数据页可能已经被加载到内存中,这样可以减少磁盘I/O操作,提高查询效率。

在某些情况下,可以通过设计合理的索引策略来避免或减少回表查询的需求。例如,如果查询经常需要访问某些列,可以考虑创建一个包含这些列的复合索引,这样就可以使用覆盖索引,避免回表查询。然而,并非所有查询都可以通过覆盖索引来优化,有时候回表查询是不可避免的。在这种情况下,合理地设计和调整索引可以帮助提高回表查询的效率。

标签:面试题,系列,聚集,查询,索引,MySQL,数据,主键
From: https://blog.csdn.net/m0_71566302/article/details/137378800

相关文章

  • MySQL面试题系列-7
    MySQL是一个关系型数据库管理系统,由瑞典MySQLAB公司开发,属于Oracle旗下产品。MySQL是最流行的关系型数据库管理系统之一,在WEB应用方面,MySQL是最好的RDBMS(RelationalDatabaseManagementSystem,关系数据库管理系统)应用软件之一。mysql的索引覆盖是什么?在MySQL......
  • Python+requests+Pytest+logging+allure+pymysql框架详解
    一、框架目录结构1)tools目录用来放公共方法存储,如发送接口以及读取测试数据的方法,响应断言数据库断言前置sql等方法;2)datas目录用例存储接口用例的测试数据,我是用excel来存储的数据,文件数据图片数据等;3)testcases目录用来存放测试用例,一个python文件对应一个接口模块的......
  • [MySQL] “MySQL 服务无法启动”原理及解决方法
    最近在学习数据库,安装MySQL时候第一条指令netstartmysql就无法正常运行,错误如下:MySQL服务正在启动.MySQL服务无法启动。服务没有报告任何错误。请键入NETHELPMSG3534以获得更多的帮助。在网上找了很多教程,百度靠前的全部都是让跟着输入以下指令:E:\Mysql\mysql-8.0.2......
  • c语言:模拟字符串拷贝功能(strcpy),面试题
    面试题:优化中的优化(10分满分)字符串拷贝:是将一个字符串的内容复制到另一个字符串中的操作。运用函数模拟字符串拷贝:(5分)模拟字符串拷贝#include<stdio.h>voidmy_strcpy(char*dest,char*str){ while(*str!='\0') { *dest=*str; str++; dest++; } *dest......
  • java计算机毕业设计(附源码)音乐播放平台(ssm+mysql+maven+LW文档)
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:随着数字时代的到来,音乐播放平台已经成为了人们生活中不可或缺的一部分。这些平台通过互联网提供了大量的音乐资源,使得用户可以随时随地欣赏到自己喜欢的......
  • java计算机毕业设计(附源码)音乐播放器app(ssm+mysql+maven+LW文档)
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:在当今的数字化时代,音乐已经成为人们日常生活中不可或缺的一部分。随着智能手机和移动互联网的普及,音乐播放器app应运而生,为人们提供了随时随地欣赏音乐......
  • mysqli 事务处理
    <?php$mysqli=newmysqli("localhost","username","password","database");//检查连接是否成功if($mysqli->connect_error){die("连接失败:".$mysqli->connect_error);}//开启一个事务$mysqli->autoc......
  • Python快速入门系列-8(Python数据分析与可视化)
    第八章:Python数据分析与可视化8.1数据处理与清洗8.1.1数据加载与查看8.1.2数据清洗与处理8.1.3数据转换与整理8.2数据可视化工具介绍8.2.1Matplotlib8.2.2Seaborn8.2.3Plotly8.3数据挖掘与机器学习简介8.3.1Scikit-learn8.3.2TensorFl......
  • IT服务专业英语-系列4
    Site-to-siteVPNroutingexampleIntroductionAsite-to-siteVPNsetupconsistsofatleasttwonetworksconnectedviaa virtualprivatenetwork. Usetheprocedureinthisguidetosetupasite-to-siteVPNconnectionwithAccessServerandasite-to-sit......
  • 从零开始学Spring Boot系列-集成MyBatis-Plus
    在SpringBoot应用开发中,MyBatis-Plus是一个强大且易于使用的MyBatis增强工具,它提供了很多实用的功能,如代码生成器、条件构造器、分页插件等,极大地简化了MyBatis的使用和配置。本篇文章将指导大家如何在SpringBoot项目中集成MyBatis-Plus。一、项目准备首先,确保你已经安装了Jav......