事务隔离级别有哪些,mysql默认的事务隔离级别是什么
事务隔离级别
- 读未提交(Read Uncommitted):最低的隔离级别。事务可以读到其他事务未提交的数据,会产生“脏读”问题。
- 读已提交(Read Committed):事务只能读到其他事务已提交的数据。解决了脏读,但会产生“不可重复读”问题(即同一个事务内,两次读取同一条数据结果不一样)。
- 可重复读(Repeatable Read):保证在同一个事务内,多次读取同一条数据的结果是一致的。解决了不可重复读问题。
- 串行化(Serializable):最高的隔离级别。强制所有事务串行执行,完全避免了脏读、不可重复读和幻读,但并发性能最低。
mysql默认事务隔离级别
- MySQL 默认的事务隔离级别是 可重复读(Repeatable Read)。
- 选择这个级别是因为它在 一致性 和 并发性 之间提供了合理的折衷,能够解决 不可重复读 和 幻读 等常见问题,并且在大多数应用场景下提供了较高的性能。
- 可重复读 隔离级别是 InnoDB 引擎的默认选择,它通过 下一键锁 减少了幻读问题的影响,因此在多数情况下都能满足大部分数据库应用的需求。
事务有哪些特性
- 原子性(atomicity):表示事务是一个不可再分割的工作单元,事务中的操作要么全部执行成功,要么全部执行失败。
- 一致性(consistency):表示事务开始之前和事务结束之后,数据库的完整性约束没有被破坏。
- 隔离性(isolation):表示多个事务并发访问时,事务之间是隔离的互不干扰的,一个事务不应该影响其它事务运行效果。
- 持久性(durability):一个事务一旦提交成功,它对数据库中的数据的操作是永久的。
mysql有哪些表引擎,为什么会使用InnoDB
存储引擎
- InnoDB:MySQL 的默认引擎(5.5 版本之后),支持事务、行级锁和外键,适合高并发的在线事务处理(OLTP)。
- MyISAM:早期版本的默认引擎,不支持事务和行级锁,但读取速度快,适合读多写少的场景。
- Memory:将所有数据存储在内存中,读写速度极快,但服务重启后数据会丢失,适合做临时表或缓存。
- Archive:支持高压缩比,只支持插入和查询,专门用于存储大量的历史归档数据或日志。
InnoDB核心优势
InnoDB 之所以成为默认引擎,是因为它在数据安全和并发性能上具备四大核心优势:
- 支持事务(ACID):这是最关键的。InnoDB 完整支持事务的原子性、一致性、隔离性和持久性,能够保证业务数据的一致性(比如转账操作要么全成功,要么全回滚)。
- 支持行级锁:相比于 MyISAM 的表级锁(一写全表阻塞),InnoDB 在更新数据时只锁定相关的行。这极大地提升了高并发场景下的读写吞吐量。
- 崩溃恢复能力强:它通过重做日志(Redo Log)机制,即使在数据库意外宕机后,也能自动恢复已提交的数据,保证数据不丢失。
- 支持外键约束:InnoDB 是 MySQL 中唯一原生支持外键的常用引擎,可以在数据库层面强制维护表与表之间的数据完整性。
在生产上是如何优化mysql查询性能
- 数据类型最小化
能用字节小的数据类型就用小的。比如状态字段用
TINYINT而不是VARCHAR,IP地址用INT UNSIGNED存储,时间用DATETIME而不是字符串。这样不仅能节省存储空间,还能提升索引效率和查询速度 - 字段尽量 NOT NULL
能设置
NOT NULL就尽量设置。因为NULL值会使索引、索引统计和值的比较都变得更复杂,增加索引的复杂度,甚至可能导致索引失效。通常建议用默认值(如0或空字符串)来代替NULL - 避免宽表
不要把几十个字段都塞进一张表里。对于不常用或体积很大的字段(比如用户简介
TEXT、头像URL等),应该通过垂直分表拆分到单独的副表中。这样主表只保留高频查询的核心字段,能大幅提升查询效率 - 高频查询字段增加索引
为
WHERE、ORDER BY、GROUP BY和JOIN中高频使用的字段创建合适的索引。特别是复合索引,要遵循最左前缀匹配原则。但也要注意“少而精”,避免创建过多索引,因为每次增删改操作都需要同步更新索引,会降低写入性能 - Redis 热点数据作缓存 对于读多写少的热点数据(如商品详情、用户信息),使用 Redis 作为缓存层。这能拦截掉绝大部分的数据库查询请求,极大地减轻 MySQL 的压力,提升系统的整体响应速度
数据表你们选取的是什么字符集,为什么这样选择
我们数据库统一使用的是 utf8mb4 字符集。
因为 MySQL 里的 utf8 其实是 utf8mb3 的别名,最多只支持 3 个字节。而真正的 UTF-8 标准是支持 4 个字节的。为了支持完整的 Unicode 字符,我们必须用 utf8mb4。
使用 utf8mb4 最大的好处是完美支持 Emoji 表情和一些生僻汉字。如果用普通的 utf8,用户输入表情时数据库会直接报错,而 utf8mb4 彻底避免了这个问题,且对常用中英文的存储开销没有影响。