Mysql相关
Table of Contents
- mysql自增主键不连续的4个场景
- MySQL一致性是怎么实现的?
- MySQL有binlog、redolog、undolog,这么多log这么多10,为什么不做优化简化?
- MySQL间隙锁、临键锁、意向锁是? MySQL的不可重复读和幻读?
- 间隙锁引发的死锁问题遇到过吗?
- MySQL如何解决RR级别下的幻读?
- 分库分表知道哪些框架和方案吗?
- 讲讲MVCC? 什么是当前读、快照读?
- 没分页,为什么会导致请求列表慢? MySQL为什么请求大数据慢? 数据的查找过程是怎么样的:
- 连接池的实现原理?
- MySQL记录会丢失吗? 同步刷盘? 怎么同步刷盘?
- MySQL索引讲讲? 索引都有什么类型? 数据结构是什么? B树和B+树的区别是什么?
- 一条SQL执行很慢可能是哪些原因? 你怎么排查?
- 主从延迟怎么办? 什么情况下不适合做读写分离?
- 订单超卖问题怎么解决?
- mysql如何优化?
- 查询一张数据量很大的表会导致什么问题?
mysql自增主键不连续的4个场景
- 自增初始值和自增步长设置不为 1
- 唯一键冲突
- 事务回滚
- 批量插入(如 insert…select 语句)
MySQL一致性是怎么实现的?
- MySQL 主要通过原子性、隔离性、持久性来保证一致性。
- ACID 四大特性之中,C(一致性)是目的,A(原子性)、I(隔离性)、D(持久性)是手段,是为了保证一致性。
MySQL有binlog、redolog、undolog,这么多log这么多10,为什么不做优化简化?
- MySQL 中多个日志的原因:每个日志都有其特定的用途,用于实现不同的功能,如记录事务操作、保证数据的一致性和可靠性等。
MySQL间隙锁、临键锁、意向锁是? MySQL的不可重复读和幻读?
- 间隙锁用于锁定间隙,防止其他事务在间隙中插入数据;
- 临键锁是间隙锁和行锁的组合,用于锁定记录及其相邻的间隙;
- 意向锁用于表示事务对表中数据的意向操作。
- MySQL 中的不可重复读和幻读:
- 不可重复读是指在同一事务中,多次读取同一数据时,结果不一致;
- 幻读是指在同一事务中,多次执行相同的查询,结果集不一致。
间隙锁引发的死锁问题遇到过吗?
- 间隙锁引发的死锁问题:当多个事务同时持有间隙锁并互相等待对方释放锁时,可能会导致死锁。
MySQL如何解决RR级别下的幻读?
- MySQL 解决 RR 级别下的幻读:通过使用间隙锁和临键锁来解决幻读问题。
分库分表知道哪些框架和方案吗?
- 常见的分库分表框架有 Sharding-JDBC、MyCat 等,
- 方案包括垂直分库、水平分库和水平分表等。
讲讲MVCC? 什么是当前读、快照读?
- MVCC 是一种并发控制技术,通过保存数据的多个版本来实现并发操作。
- 当前读是读取最新版本的数据,快照读是读取指定版本的数据。
没分页,为什么会导致请求列表慢? MySQL为什么请求大数据慢? 数据的查找过程是怎么样的:
- 可能是由于查询的数据量过大,导致数据库需要进行全表扫描或大量的磁盘 I/O 操作。
- MySQL 请求大数据慢的原因:可能是由于数据量过大、网络延迟、数据库配置不合理等原因导致的。
- 数据的查找过程:通常包括索引查找、数据读取和结果返回等步骤。
连接池的实现原理?
- 连接池的实现原理:连接池通过维护一定数量的数据库连接,避免频繁地创建和释放连接,提高数据库操作的性能。
MySQL记录会丢失吗? 同步刷盘? 怎么同步刷盘?
- MySQL 记录丢失的情况:在数据库崩溃、硬件故障或人为错误等情况下,可能会导致 MySQL 记录丢失。
- MySQL 同步刷盘的方式:可以通过配置 innodb_flush_log_at_trx_commit 参数来控制同步刷盘的方式
MySQL索引讲讲? 索引都有什么类型? 数据结构是什么? B树和B+树的区别是什么?
- 索引是一种用于提高数据库查询效率的数据结构。在 MySQL 中,常见的索引类型包括:
- 主键索引(PRIMARY KEY):唯一标识表中的每一行数据,一个表只能有一个主键索引。
- 唯一索引(UNIQUE):确保索引列的值是唯一的。
- 普通索引(INDEX):可以加快数据的查询速度。
- 组合索引(也叫联合索引):由多个列组成的索引。
- MySQL 索引的数据结构主要有 B 树和 B+树。
B 树和 B+树的区别主要有以下几点:
- B+树的非叶子节点不存储数据,只存储索引信息,而 B 树的非叶子节点和叶子节点都会存储数据。
- B+树的叶子节点之间通过链表相连,便于范围查询,而 B 树则没有这样的链表结构。
- B+树的所有数据都存储在叶子节点,而 B 树的数据可以存储在非叶子节点和叶子节点。
一条SQL执行很慢可能是哪些原因? 你怎么排查?
- 没有用上索引或索引失效。
- 数据库在刷新脏页,例如 redo log 写满了需要同步到磁盘。
- 执行的时候遇到锁,如表锁、行锁。
排查方法如下:
- 使用 EXPLAIN 命令
- EXPLAIN 指标有那些?
- 检查索引:确保查询使用了正确的索引,并且索引没有失效。
- 检查锁:如果查询遇到了锁,可能会导致执行时间变慢。可以通过检查锁的状态来确定是否存在锁竞争。
- 检查数据库配置:检查数据库的配置参数,如缓存大小、连接数等,确保它们适合当前的工作负载。
主从延迟怎么办? 什么情况下不适合做读写分离?
主从延迟的解决办法有以下几种:
- 优化主库的写入性能,比如减少大事务、避免长事务。
- 增加从库数量,分担读压力,减轻单个从库的同步负担。
- 调整从库的参数,例如增大 `slave_parallel_workers` 来提高并行复制的效率。
- 检查网络状况,确保主从之间的网络稳定且带宽足够。
以下情况不适合做读写分离:
- 对数据一致性要求非常高,无法容忍主从延迟带来的数据不一致。
- 读操作的并发量不大,主库能够承担读写压力。
- 业务逻辑复杂,难以清晰地区分读和写操作。
订单超卖问题怎么解决?
- Mysql锁:
- 乐观锁: 在数据库中使用乐观锁机制,通过版本号或时间戳来确保库存更新的原子性。
- 悲观锁: 在关键的库存扣减操作中使用悲观锁,确保在操作期间库存数据不会被其他事务修改。
- 预扣库存: 在用户下单时预扣库存,但暂时不减少实际库存,直到支付完成后再确认扣减。
- 库存预留: 对于高需求商品,可以在用户下单后立即预留库存,设置一个合理的预留时间,如果用户在这段时间内未完成支付,则释放库存。
- 队列机制: 使用消息队列来管理订单和库存扣减操作,确保操作的 顺序执行 。
- 分布式锁: 使用Redis分布式锁来保证跨多个节点的库存扣减操作的一致性。
- 查询库存 和 扣减库存这个操作不是原子性的。可能会引起多线程并发问题。
- 所以用基于redission的分布式锁可以解决这个问题。
- lua脚本实现原子操作。
- 限流: 对于高并发场景,通过限流来控制同时处理的订单数量,减少超卖的风险。
- 订单取消策略: 设定订单取消策略,对于超卖的订单,自动取消并给予用户适当的补偿。
mysql如何优化?
- 索引优化
- 确保对经常用于查询条件的列建立索引。
- 避免对大型表的非前缀列使用全文索引。
- 定期重建索引以减少碎片化。
- 查询优化
- 优化SQL语句,避免使用SELECT *,只获取需要的列。
- 使用EXPLAIN关键字分析查询语句的执行计划。
- 避免在WHERE子句中使用函数,因为这会导致索引失效。
- 数据类型优化
- 选择合适的数据类型,避免过度使用大型数据类型,如VARCHAR(255)。
- 表结构优化
- 将大表拆分为多个小表,以减少单个查询的数据量。
- 读写分离
- 在高并发场景下,使用主从复制和读写分离来分散数据库负载。
- 数据库监控
- 使用监控工具来跟踪慢查询、性能瓶颈和资源使用情况。
- 定期维护
- 定期进行数据库维护,如优化表(OPTIMIZE TABLE)、清理碎片等。
查询一张数据量很大的表会导致什么问题?
- 性能下降
- 大量的数据处理会消耗更多的CPU和I/O资源,导致查询响应时间变长。
- 锁竞争
- 在高并发环境下,多个事务可能会争用同一资源,导致锁等待和死锁。
- 内存溢出
- 如果查询操作需要大量内存来缓存数据,可能会导致内存不足。
- 网络瓶颈
- 大量数据的传输可能会占用大量网络带宽,影响其他操作。
- 数据库崩溃
- 在极端情况下,资源耗尽可能导致数据库服务崩溃。
- 慢查询
- 大表上的复杂查询可能会执行很长时间,影响用户体验。
- 数据不一致
- 如果查询操作涉及到大量的数据更新,可能会导致数据不一致。
- 备份和恢复时间延长
- 大表的备份和恢复操作可能会非常耗时。