当前位置: 首页 > news >正文

【面试篇】Mysql

1. 请介绍一下 MySQL 常见的存储引擎(如 InnoDB、MyISAM),它们的特点分别是什么?在什么场景下适合使用 InnoDB,什么场景下适合使用 MyISAM?

  • InnoDB:
    特点:支持事务,具有 ACID 特性;支持外键约束;采用行级锁,并发性能较好;有崩溃恢复能力;支持聚簇索引。
    适用场景:适用于对数据完整性和并发要求较高的场景,如在线事务处理(OLTP)系统,像电商系统中的订单、库存管理等。
  • MyISAM:
    特点:不支持事务和外键;采用表级锁,并发性能较差;不支持崩溃恢复;索引和数据是分开存储的。
    适用场景:适用于对读性能要求较高,对事务要求不高的场景,如数据仓库、日志记录等。

2. 在 MySQL 中,事务的四大特性(ACID)分别是什么?如何在 Java 代码中使用 JDBC 来管理 MySQL 事务?请举例说明。

ACID 特性:

  • 原子性(Atomicity):事务是一个不可分割的操作序列,要么全部执行成功,要么全部失败回滚。
  • 一致性(Consistency):事务执行前后,数据库的状态保持一致。
  • 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应该影响其他事务的执行。
  • 持久性(Durability):事务一旦提交,其对数据库的改变是永久的。

3. 索引的作用和原理

  • 作用:索引可以提高数据库的查询效率,减少数据库的 IO 操作。
  • 原理:索引是一种数据结构,它将表中的某些列的值进行排序,并建立一个映射关系,通过这个映射关系可以快速定位到数据所在的位置。

4. 常见索引类型

  • B 树索引:是一种平衡的多路搜索树,适用于范围查询和排序操作。
  • 哈希索引:通过哈希函数将索引列的值映射到一个哈希表中,适用于等值查询。

5. 索引不是越多越好

不是;索引会占用额外的存储空间,并且在插入、更新和删除数据时,需要维护索引,会影响数据库的写入性能

6. 优化索引的使用

  • 只对经常用于查询条件、排序和连接的列创建索引。
  • 避免在低选择性的列上创建索引。
  • 定期对索引进行优化和重建。

7. 当你发现 MySQL 数据库的查询性能较差时,你会从哪些方面进行优化?请举例说明。

  • 索引优化:对经常用于查询条件、排序和连接的列创建索引。例如,如果经常根据 user_id 进行查询,可以在 user_id 列上创建索引。
  • SQL 语句优化:避免使用子查询,尽量使用 JOIN 代替;避免使用 SELECT *,只选择需要的列。
  • 数据库配置优化:调整数据库的参数,如 innodb_buffer_pool_size 等。
  • 表结构优化:合理设计表结构,避免数据冗余。

8. 主从复制的原理和作用

  • 原理:主从复制是指将主数据库的变更记录到二进制日志(binlog)中,从数据库通过 I/O 线程读取主数据库的 binlog,并将其应用到自己的数据库中。
  • 作用:提高数据库的可用性和读写性能,实现数据的备份和灾难恢复。

9. Java 应用实现读写分离的思路和步骤

思路:将读操作指向从数据库,将写操作指向主数据库。
步骤:
配置主从数据库,确保主从复制正常工作。
在 Java 应用中,使用多个数据源分别连接主数据库和从数据库。
根据 SQL 语句的类型(读或写)选择不同的数据源。可以通过 AOP 或自定义注解来实现。

10.MySQL 中有哪些常见的锁类型(如共享锁、排他锁、行锁、表锁等)?它们的区别是什么?

  • 共享锁(Shared Lock):多个事务可以同时对同一资源加共享锁,共享锁之间是兼容的,但共享锁与排他锁不兼容。
  • 排他锁(Exclusive Lock):一个事务对资源加排他锁后,其他事务不能再对该资源加任何类型的锁。
  • 行锁(Row Lock):锁定表中的某一行数据,并发性能较好。
  • 表锁(Table Lock):锁定整个表,并发性能较差。
http://www.dtcms.com/a/112024.html

相关文章:

  • DHCP之中继 Relay-snooping及配置命令
  • Python_level1_字符串_11
  • 给项目中的用户头像,添加用户的历史头像记录功能
  • 深入理解SQL中的<>运算符:不等于的灵活运用
  • C++20的协程简介
  • 轨迹速度聚类 实战
  • 【C++代码整洁之道】第九章 设计模式和习惯用法
  • VSCode运行,各类操作缓慢,如何清理
  • anaconda3/conda依赖安装、环境配置、关联指定python版本
  • 性能测试之jmeter的基本使用
  • [C++面试] new、delete相关面试点
  • 从软件分层架构视角理解英语学习
  • 为什么有的深度学习训练,有训练集、验证集、测试集3个划分,有的只是划分训练集和测试集?
  • 【YOLO系列(V5-V12)通用数据集-X光包裹内违禁品检测数据集】
  • Java 大视界 -- Java 大数据在智能供应链库存优化与成本控制中的应用策略(172)
  • AI平台初步规划实现和想法
  • 20信号和槽_connect函数的用法(1)
  • 隐私投资的收益大于成本
  • 【更新至2024年】2000-2024年各省专利侵权案件结案数数据
  • 基于大模型预测不稳定性心绞痛的多维度研究与应用
  • 若依框架二次开发——RuoYi-AI 集成本地大模型
  • 新冠(covid19)完整测序流程(java调用docker容器方式实现,算法为nextclade和pangolin)
  • 如何在未知iv值情况下如何进行手工破译ROT密文?
  • 【python中级】解压whl文件内容
  • Muduo网络库实现 [十三] - HttpRequest模块
  • 【AI论文】AnimeGamer:基于下一游戏状态预测的无限动漫人生模拟
  • 解锁工业通信:Profibus DP到ModbusTCP网关指南!
  • 第十五届蓝桥杯大赛软件赛省赛Python 大学 C 组:3.数字诗意
  • 基于 jQuery 实现二级下拉框选择功能
  • 技巧:使用 ssh 设置隧道代理访问 github