2026/4/17 9:21:34
网站建设
项目流程
哪些网站被墙,专业团队下一句,个人网站可以做百度推广吗,专业制作彩铃网站1、MySQL 的存储引擎有哪些#xff1f;
答#xff1a;
InnoDB#xff08;默认#xff09;#xff1a;支持事务、行级锁、外键约束#xff0c;适用于高并发写入。MyISAM#xff1a;不支持事务#xff0c;表级锁#xff0c;适用于读密集型应用。Memory#xff1a;数据…1、MySQL 的存储引擎有哪些答InnoDB默认支持事务、行级锁、外键约束适用于高并发写入。MyISAM不支持事务表级锁适用于读密集型应用。Memory数据存储在内存中速度快但重启后数据丢失。Archive适用于存储和检索大量归档数据压缩率高。只支出插入和查询。2、InnoDB 和 MyISAM 的区别特性InnoDBMyISAM事务支持✅ 支持❌ 不支持锁机制行级锁表级锁外键支持✅ 支持❌ 不支持崩溃恢复✅ 支持❌ 不支持全文索引✅MySQL 5.6✅ 支持适用场景高并发写入、事务处理读多写少、查询快3、什么是事务MySQL 如何支持事务答事务是一组 SQL 操作要么全部成功COMMIT要么全部失败ROLLBACK。MySQL 通过 InnoDB 引擎支持事务并提供ACID特性AAtomicity原子性事务不可分割。CConsistency一致性数据在事务前后保持一致。IIsolation隔离性事务之间互不干扰。DDurability持久性事务提交后数据永久保存。4、MySQL 的隔离级别有哪些答隔离级别脏读不可重复读幻读READ UNCOMMITTED✅ 可能✅ 可能✅ 可能READ COMMITTED❌ 不可能✅ 可能✅ 可能REPEATABLE READ❌ 不可能❌ 不可能✅ 可能SERIALIZABLE❌ 不可能❌ 不可能❌ 不可能MySQL 默认隔离级别是REPEATABLE READ可重复读。脏读指的是一个事务读取了另一个尚未提交的事务修改过的数据。数据尚未提交被别人查询了不可重复读指的是在同一个事务内多次读取同一数据时由于其他并发事务的修改或删除导致前后读取的结果不一致。数据可能不一致幻读指的是在同一事务内多次执行相同的查询但由于其他并发事务插入INSERT了新数据导致前后查询结果的行数发生变化。数据一致但是记录行数可能有变化5、如何优化 MySQL 查询答使用 EXPLAIN 分析 SQL 执行计划合理使用索引避免全表扫描避免 SELECT ***只查询需要的字段优化 JOIN 查询小表驱动大表尽量少用子查询必须使用时用in子查询的记录数越少越好。使用 LIMIT 分页避免 OFFSET 过大对适合分区的大表进行分区操作对经常性需要聚合统计的表设计中间聚合表定期进行数据聚合6、什么是死锁如何避免答死锁是多个事务互相等待对方释放锁导致无限阻塞。避免方法按固定顺序访问表和行减少事务持有锁的时间比如查询扫描记录行数尽量少索引选择度要高合理使用索引不同索引字段顺序不要相反将大事务拆分成小事务并且避免事务嵌套不要使用高级锁或者强行指定高级锁。如 update 。。。。 for update。使用SHOW ENGINE INNODB STATUS分析死锁应用层面检测并设置超时重试等。7、MySQL 主从复制的原理答主库Master记录 binlog二进制日志。从库Slave的 IO 线程拉取 binlog。SQL 线程重放 binlog 到从库。8、什么情况下索引会失效答使用!或NOT INSELECT * FROM users WHERE age ! 30;LIKE 以通配符开头SELECT * FROM users WHERE name LIKE %张%;对列进行运算或函数操作SELECT * FROM users WHERE YEAR(create_time) 2023;OR 条件未全部使用索引SELECT * FROM users WHERE id 1 OR name 张三; -- 如果 name 无索引全表扫描9、什么是 MVCC如何实现MVCCMulti-Version Concurrency Control多版本并发控制是数据库管理系统如MySQL InnoDB、PostgreSQL等实现高并发访问的核心机制它通过数据多版本和快照读的方式使读写操作可以并发执行而不互相阻塞从而大幅提高数据库性能。一、核心思想MVCC 的核心是保留数据的多个版本每个事务看到的是符合其隔离级别的数据快照Snapshot读操作不阻塞写操作写操作也不阻塞读操作通过版本链和可见性判断实现不同事务看到不同的数据版本二、实现关键在 InnoDB 中MVCC 主要依赖以下技术实现1. 隐藏字段InnoDB 每行记录row包含几个隐藏字段DB_TRX_ID6字节最近修改该行的事务IDDB_ROLL_PTR7字节回滚指针指向 undo log 中的旧版本数据DB_ROW_ID6字节行ID如果没有主键InnoDB 会自动生成2. Undo Log回滚日志存储数据修改前的旧版本形成版本链用于事务回滚和 MVCC 的可见性判断3. ReadView读视图事务执行快照读时生成的一个数据可见性快照包含m_ids当前活跃未提交的事务ID列表min_trx_id最小活跃事务IDmax_trx_id下一个要分配的事务IDcreator_trx_id创建该 ReadView 的事务ID三、如何判断数据可见性InnoDB 通过ReadView 版本链判断某行数据是否对当前事务可见如果行的DB_TRX_IDmin_trx_id说明该行在 ReadView 创建前已提交可见。如果DB_TRX_ID≥max_trx_id说明该行在 ReadView 创建后修改不可见。如果min_trx_id≤DB_TRX_IDmax_trx_id如果DB_TRX_ID在m_ids中即事务未提交不可见。否则事务已提交可见。4. 如果DB_TRX_IDcreator_trx_id说明是当前事务自己修改的可见。如果不可见则通过DB_ROLL_PTR找到 undo log 中的旧版本继续判断。10、MySQL 主从延迟怎么解决答优化从库配置提升从库硬件性能CPU、SSD。设置slave_parallel_workers启用并行复制。减少大事务避免主库执行长时间事务。从库可以考虑临时关闭写日志参数。修改从库日志刷新方式参数。sync_binlog0 innodb_flush_log_at_trx_commit120 1每次事务提交都刷盘(最安全) 0每秒刷盘一次(性能最好风险最高) 2每次提交写到OS缓存每秒刷盘(折中)11、InnoDB的索引组织结构是怎样的为什么推荐使用自增主键答案InnoDB索引采用B树结构特点包括非叶子节点只存索引键和指针叶子节点包含完整数据聚簇索引或主键值二级索引叶子节点通过双向链表连接推荐自增主键原因插入性能避免随机IO减少页分裂空间利用率顺序写入填充率高范围查询对主键的范围查询效率极高12、如何处理MySQL中的海量删除操作答案如果是整表删除使用drop/truncatedrop table log 或者 truncate table log分批删除可以借助于脚本进行遍历分批删除DELETE FROM logs WHERE created_at 2020-01-01 LIMIT 1000; -- 循环执行直到影响行数为0创建新表交换CREATE TABLE new_logs LIKE logs; INSERT INTO new_logs SELECT * FROM logs WHERE created_at 2020-01-01; RENAME TABLE logs TO old_logs, new_logs TO logs; DROP TABLE old_logs;13、如何优化大表查询语句优化1增加 limit 限制查询返回条数2避免设置offset大数值的分页select * from log limit 1000000,10; # 优化前 # 优化器需要一条一条找到第1000000条再向后找10条并返回 select * from log where id 1000000 order by id limit 10; # 优化后 # 优化器直接根据id 索引一步到位定位到第1000000 条记录再向后找10条并返回索引优化1根据查询字段建立合适的索引2尽量建立覆盖索引减少回表。如果索引包含所有查询字段则查询可以根据索引查询即可不需要再回表根据主键等查询到其他字段。架构优化1一般日志性、统计性或者一些不会经常性变更的表可以根据时间字段设计为分区表可以减少查询时遍历大批无效数据2进行历史数据归档。按时间设置为原表名时间格式的新表业务可以根据规律进行历史数据查询。