MySQL面试题系列-8

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MySQL面试题系列-8


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

mysql的全复制、半复制、异步复制

MySQL的全复制、半复制和异步复制是三种不同的数据复制策略,用于在主从数据库之间同步数据。

  1. 全复制(Full Replication):全复制是指将主数据库上的所有操作都复制到从数据库。这种复制策略适用于对数据一致性要求较高的场景,因为它可以确保从数据库与主数据库的数据完全一致。但是,全复制可能会对主数据库的性能产生影响,因为它需要记录所有操作的日志并同步到从数据库。
  2. 半复制(Semi-Replication):半复制是指只复制主数据库上的部分操作到从数据库。这种复制策略适用于对数据一致性要求较低的场景,因为它可以减少主数据库的负载。半复制可以通过配置主从数据库的过滤规则来实现,例如只复制某个数据库或某个表的数据。
  3. 异步复制(Asynchronous Replication):异步复制是指主数据库上的操作不会立即复制到从数据库,而是在一定时间间隔后进行复制。这种复制策略适用于对数据一致性要求较低,但对性能要求较高的场景。异步复制可以减少主数据库的负载,但可能会导致从数据库的数据滞后于主数据库。

总之,全复制、半复制和异步复制是MySQL提供的三种不同数据复制策略,可以根据实际需求选择合适的复制策略来平衡数据一致性和性能。

mysql半同步复制的特点

半同步复制是MySQL中一种介于异步复制和同步复制之间的数据复制机制,它结合了两者的特点以提供更好的性能和数据一致性保障。

具体来说,半同步复制的特点包括:

  1. 延迟低:与异步复制相比,半同步复制可以减少从库的数据滞后,因为主库在提交事务前需要等待至少一个从库的确认。
  2. 数据一致性:半同步复制提高了数据的一致性,因为它确保至少有一个从库接收到了来自主库的更新,从而减少了数据丢失的风险。
  3. 性能影响:虽然半同步复制增加了一些延迟,但它对性能的影响小于同步复制,因为它不需要所有从库都确认接收到更新才能完成主库上的事务。
  4. 支持性:半同步复制要求MySQL服务器支持动态加载插件,这意味着必须满足一定的服务器配置要求。
  5. 配置限制:半同步复制只支持默认的复制通道,不能配置多个复制通道。
  6. 版本要求:从MySQL 5.5版本开始,MySQL以插件的形式支持半同步复制。
  7. 适用场景:半同步复制适用于对数据一致性有较高要求,同时希望保持较好写性能的场景。
  8. 容错性:半同步复制提供了比异步复制更好的容错性,因为它确保至少有一份数据的副本被确认。
  9. 实现方式:半同步复制是通过安装特定的插件来实现的,这需要在已有的主从复制环境中进行配置。
  10. 兼容性:半同步复制可以与现有的主从复制环境兼容,无需大规模更改现有架构。
  11. 网络要求:由于涉及到主从之间的实时通信,半同步复制对网络的稳定性和延迟有一定的要求。
  12. 故障处理:在出现网络问题或从库故障时,半同步复制可以自动退化为异步复制,以保证主库的持续运行。

综上所述,半同步复制是一种平衡了性能和数据一致性的数据复制策略,适用于多种应用场景,尤其是在需要保证较高数据一致性的同时,也要考虑到写操作的性能。

drop,delete与truncate的区别

在数据库操作中,dropdelete以及truncate都可以用来删除数据,但它们在使用上有所区别。具体分析如下:

  • deletedelete是数据库的DML(Data Manipulation Language)操作语言的一部分,用于删除表中的数据。它可以通过where子句来指定条件,实现部分数据的删除。delete会走事务,执行时会触发触发器(trigger)。在InnoDB引擎中,使用delete删除数据时,表文件在磁盘上所占的空间不会变小,因为MySQL只是将删除的数据标记为已删除,并不是真正的物理删除。
  • truncatetruncate是一个快速删除表中所有数据的方法。与delete相比,它的执行速度更快,因为它不会记录每一行的删除操作,也不会触发与每行相关的触发器。truncate只删除数据,不删除表结构,包括列、约束等。使用truncate后,表的自增计数器会重置为初始值。
  • dropdrop不仅删除表中的所有数据,还会删除整个表的结构,包括表的索引、约束和触发器。此外,依赖于该表的存储过程和函数也会受到影响。drop是不可恢复的操作,一旦执行,所有的数据和表结构都将被永久删除。

总的来说,delete适用于需要删除部分数据并且可能需要触发器参与的场景;truncate适用于需要快速清空表中所有数据,但不改变表结构的场合;而drop则用于彻底删除整个表及其结构,通常在不再需要该表时使用。在实际使用中,应根据具体的数据删除需求选择合适的命令。

什么情况下应不建或少建索引

在某些特定情况下,不建或少建索引是更为合理的选择。以下是一些具体的情况:

  1. 表记录较少:如果一个表的记录非常少,例如只有几条记录,那么使用索引来查询数据可能不会带来性能上的提升。因为索引通常需要额外的磁盘空间和维护成本,而且访问索引后再访问数据表,会增加读取数据块的次数。
  2. 频繁更新的列:对于那些经常发生数据变化的列,建立索引可能会导致索引维护的成本过高。每次数据更新时,不仅需要更新记录本身,还需要更新与之相关的索引,这会降低更新操作的性能。
  3. 数据类型为BLOB或TEXT的列:由于BLOB和TEXT类型的数据通常较大,对这类数据建立索引会占用大量的存储空间,且检索效率不高,因此不建议在这些列上创建索引。
  4. 数据重复度高的列:如果一个列的数据重复度很高,即数据分布比较均匀,那么这个列上的索引效率会很低。因为索引的优势在于快速定位唯一的或范围较小的数据,而当唯一性差时,索引的效果不明显。
  5. 查询条件中用不到的字段:如果某个字段从不作为查询条件出现,那么在这个字段上建立索引是没有意义的。只有那些经常用于搜索、排序或分组的字段才适合建立索引。
  6. 高并发环境下的选择:在高并发的情况下,可能需要根据具体的业务需求和访问模式来选择合适的索引类型,比如复合索引,以优化性能。
  7. 主键自动建立唯一索引:数据库中的主键会自动建立唯一索引,因此不需要额外再为这些字段创建索引。
  8. 外键关联的字段:如果某个字段是表与表之间的外键关系,通常不需要额外创建索引,除非有特定的性能要求。
  9. 排序和分组操作的字段:如果某个字段经常用于排序或分组操作,那么在这些字段上建立索引可以显著提高操作的速度。
  10. 统计操作的字段:对于经常需要进行统计计算的字段,建立索引可以加快统计速度。
  11. 表数据量小且确定性低的表:如果一个表的数据量很小,且数据变化不大,可能不需要建立索引。

总的来说,在考虑是否建立索引时,应该综合考虑表的大小、数据的更新频率、查询模式以及性能需求等因素。不恰当的索引可能会降低数据库的整体性能,因此在上述情况下应谨慎处理索引的创建。

创建数据库表要注意什么?

在创建数据库表时,需要注意以下几个关键点:

  1. 设计原则
  • 确保表中的每一列都与主键直接相关,遵循面向对象的原则。
  • 单一职责原则,即一个表应该只负责一项业务逻辑,如果一张表承担了多个职责,应该进行拆分。
  • 字段与表直接关联,如果字段与当前表是间接关联的,应新建一张表来存储这些字段。
  • 字段最小原子化,即一个字段不应包含多个信息或含义,应当拆分成多个字段。
  • 字段名唯一且描述性强,避免单个单词形式存在,以便于理解和维护。
  1. 命名规范
  • 库名、表名、字段名全部使用小写字母,并用下划线“_”分割。
  • 名称不得超过12个字符,并且应见名知意,建议使用名词而非动词。
  1. 数据类型选择
  • 使用InnoDB存储引擎,因为它提供了事务支持和更好的性能。
  • 对于精确的浮点数,应使用DECIMAL类型而非FLOAT或DOUBLE。
  • 对于非负数值,建议使用UNSIGNED属性。
  • 当取值范围较小时,比如0-80,使用TINYINT UNSIGNED。
  • 尽量避免使用ENUM类型,可以用TINYINT代替。
  • 尽可能不使用TEXT、BLOB类型,除非必要。
  1. SQL语法
  • 在创建表时,需要定义表名、列名以及每个列的数据类型。
  • 使用正确的SQL语法,例如CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL, ...);来创建一个用户表。

总的来说,创建数据库表时应遵循设计原则,注意命名规范,选择合适的数据类型,并使用正确的SQL语法。这些注意事项有助于确保数据库的可维护性、性能和扩展性。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
存储 关系型数据库 MySQL
MySQL 三万字精华总结 + 面试100 问,和面试官扯皮绰绰有余
本文详细介绍了MySQL数据库的相关知识和技术要点,包括架构、存储引擎、数据类型、索引、查询、事务和锁机制等内容。以下是简介: 本文从MySQL架构入手,详细讲解了其独特的插件式存储引擎设计,并深入探讨了连接层、服务层、存储引擎层和数据存储层的工作原理。接着,文章对比了常见的存储引擎如InnoDB与MyISAM的特点与应用场景。在数据类型章节,介绍了MySQL支持的主要数据类型及其用途。索引部分则深入剖析了B+树索引的优势及其在InnoDB中的实现细节,并解释了聚簇索引与非聚簇索引的区别。事务章节详细解释了ACID特性和隔离级别的概念,并介绍了MVCC机制。最后,锁机制部分
MySQL 三万字精华总结 + 面试100 问,和面试官扯皮绰绰有余
|
12天前
|
存储 关系型数据库 MySQL
阿里面试:为什么要索引?什么是MySQL索引?底层结构是什么?
尼恩是一位资深架构师,他在自己的读者交流群中分享了关于MySQL索引的重要知识点。索引是帮助MySQL高效获取数据的数据结构,主要作用包括显著提升查询速度、降低磁盘I/O次数、优化排序与分组操作以及提升复杂查询的性能。MySQL支持多种索引类型,如主键索引、唯一索引、普通索引、全文索引和空间数据索引。索引的底层数据结构主要是B+树,它能够有效支持范围查询和顺序遍历,同时保持高效的插入、删除和查找性能。尼恩还强调了索引的优缺点,并提供了多个面试题及其解答,帮助读者在面试中脱颖而出。相关资料可在公众号【技术自由圈】获取。
|
5天前
|
SQL 缓存 关系型数据库
美团面试:Mysql 有几级缓存? 每一级缓存,具体是什么?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴因未能系统梳理MySQL缓存机制而在美团面试中失利。为此,尼恩对MySQL的缓存机制进行了系统化梳理,包括一级缓存(InnoDB缓存)和二级缓存(查询缓存)。同时,他还将这些知识点整理进《尼恩Java面试宝典PDF》V175版本,帮助大家提升技术水平,顺利通过面试。更多技术资料请关注公号【技术自由圈】。
美团面试:Mysql 有几级缓存? 每一级缓存,具体是什么?
|
7天前
|
SQL 关系型数据库 MySQL
美团面试:Mysql如何选择最优 执行计划,为什么?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴面试美团时遇到了关于MySQL执行计划的面试题:“MySQL如何选择最优执行计划,为什么?”由于缺乏系统化的准备,小伙伴未能给出满意的答案,面试失败。为此,尼恩为大家系统化地梳理了MySQL执行计划的相关知识,帮助大家提升技术水平,展示“技术肌肉”,让面试官“爱到不能自已”。相关内容已收录进《尼恩Java面试宝典PDF》V175版本,供大家参考学习。
|
18天前
|
SQL 关系型数据库 MySQL
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
尼恩,一位40岁的资深架构师,通过其丰富的经验和深厚的技術功底,为众多读者提供了宝贵的面试指导和技术分享。在他的读者交流群中,许多小伙伴获得了来自一线互联网企业的面试机会,并成功应对了诸如事务ACID特性实现、MVCC等相关面试题。尼恩特别整理了这些常见面试题的系统化解答,形成了《MVCC 学习圣经:一次穿透MYSQL MVCC》PDF文档,旨在帮助大家在面试中展示出扎实的技术功底,提高面试成功率。此外,他还编写了《尼恩Java面试宝典》等资料,涵盖了大量面试题和答案,帮助读者全面提升技术面试的表现。这些资料不仅内容详实,而且持续更新,是求职者备战技术面试的宝贵资源。
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
|
19天前
|
SQL 关系型数据库 MySQL
京东面试:什么情况下 mysql RR不能解决幻读? RR隔离mysql如何实现?
老架构师尼恩在其读者交流群中分享了关于MySQL事务隔离级别的深入解析,特别针对RR级隔离如何解决幻读问题进行了详细讨论。文章不仅解释了ACID中的隔离性概念,还列举了四种事务隔离级别(未提交读、提交读、可重复读、串行读)的特点及应用场景。尼恩通过具体的例子和图表,清晰地展示了不同隔离级别下的并发事务问题(脏读、不可重复读、幻读)及其解决方案,特别是RR级隔离下的MVCC机制如何通过快照读和当前读来防止幻读。此外,尼恩还提供了相关面试题的解答技巧和参考资料,帮助读者更好地准备技术面试。更多详细内容和实战案例可在《尼恩Java面试宝典》中找到。
|
29天前
|
SQL 安全 关系型数据库
MySQL 增删操作面试题
MySQL 增删操作面试题
101 1
|
2月前
|
存储 关系型数据库 MySQL
【Java面试题汇总】MySQL数据库篇(2023版)
聚簇索引和非聚簇索引、索引的底层数据结构、B树和B+树、MySQL为什么不用红黑树而用B+树、数据库引擎有哪些、InnoDB的MVCC、乐观锁和悲观锁、ACID、事务隔离级别、MySQL主从同步、MySQL调优
【Java面试题汇总】MySQL数据库篇(2023版)
|
19天前
|
SQL 关系型数据库 MySQL
美团面试:mysql 索引失效?怎么解决? (重点知识,建议收藏,读10遍+)
本文详细解析了MySQL索引失效的多种场景及解决方法,包括破坏最左匹配原则、索引覆盖原则、前缀匹配原则、`ORDER BY`排序不当、`OR`关键字使用不当、索引列上有计算或函数、使用`NOT IN`和`NOT EXISTS`不当、列的比对等。通过实例演示和`EXPLAIN`命令分析,帮助读者深入理解索引失效的原因,并提供相应的优化建议。文章还推荐了《尼恩Java面试宝典》等资源,助力面试者提升技术水平,顺利通过面试。
|
19天前
|
存储 关系型数据库 MySQL
面试官:MySQL一次到底插入多少条数据合适啊?
本文探讨了数据库插入操作的基础知识、批量插入的优势与挑战,以及如何确定合适的插入数据量。通过面试对话的形式,详细解析了单条插入与批量插入的区别,磁盘I/O、内存使用、事务大小和锁策略等关键因素。最后,结合MyBatis框架,提供了实际应用中的批量插入策略和优化建议。希望读者不仅能掌握技术细节,还能理解背后的原理,从而更好地优化数据库性能。