数据库复习
一、SQL执行顺序
from -> join -> where -> group by -> having -> select -> distinct -> order by -> limit
二、常见的联合查询方式
-
INNER JOIN:返回交集数据
-
LEFT JOIN:保留左表全部记录
-
RIGHT JOIN:保留右表全部记录
-
CROSS JOIN:笛卡尔积
-
UNION:合并结果集(自动去重)
三、MySQL存储引擎对比
引擎 | 事务支持 | 锁粒度 | 外键 | 试用场景 |
InnoDB | 支持 | 行级锁 | 支持 | 高并发事务处理 |
MyISAM | 不支持 | 表级锁 | 不支持 | 读多写少,全文索引 |
Memory | 不支持 | 表级锁 | 不支持 | 临时数据缓存 |
四、InnoDB选择B+树的原因
-
层级更低:相比B树,B+树非叶子节点不存数据,使得同样数据量下树高更低
-
范围查询高效:叶子节点形成链表,适合范围扫描
-
磁盘IO优化:每个节点存储更多指针,减少磁盘访问次数
五、InnoDB引擎的存储过程
InnoDB 通过内存池管理数据缓存,使用 B+树 组织索引
数据写入流程:
写入操作
数据修改先写入内存池 中的页(Page)。
同时保证持久性和 事务回滚。
刷盘机制
Checkpoint 机制:定期将脏页(修改后的页)刷新到磁盘。防止页写入不完整的问题。
事务提交
六、 drop、delete、truncate的区别
命令 | 类型 | 是否可回滚 | 重置自增ID | 执行速度 | 场景 |
drop | DDL | 否 | 是 | 最快 | 彻底删除表 |
truncate | DDL | 否 | 是 | 较快 | 清空表并释放空间 |
delete | DML | 否 | 是 | 最慢 | 条件删除数据 |
七、 索引失效的八大场景
-
隐式类型转换:
WHERE name = 123
(name为字符串类型) -
左模糊查询:
WHERE content LIKE '%abc'
-
OR连接非索引列:
WHERE a=1 OR b=2
(仅a有索引) -
函数操作字段:
WHERE YEAR(create_time) = 2023
-
联合索引违反最左前缀:索引(a,b,c)时查询
WHERE b=2
-
数据倾斜严重:某值出现频率超过30%
-
使用不等于(!=/<>)
-
参数化查询类型不匹配
八、 索引回表与避免策略
回表:二级索引未覆盖查询列时,需根据主键回聚簇索引查数据。
避免方法:
使用覆盖索引(索引包含所有查询字段)。
创建联合索引,减少回表次数。
九、 事务特性与隔离级别
ACID特性:
原子性: 事务不可分割,全部成功或全部失败。
一致性: 事务执行前后数据库的一致性。
隔离性: 多个事务并发执行对彼此的独立影响。
持久性: 一旦事务完成,其结果会永久保存。
隔离级别:
级别 | 脏读 | 不可重复读 | 幻读 |
READ UNCOMMITTED | × | × | × |
READ COMMITTED | √ | × | × |
REPEATABLE READ | √ | √ | × |
SERIALIZABLE | √ | √ | √ |
十、 SQL优化的方式和索引优化的方式
SQL 优化:
避免 SELECT *,仅选择必要列。
使用LIMIT限制结果集大小。
尽量减少子查询,使用 JOIN 替代。
索引优化:
确保索引覆盖查询。
正确选择索引列(高选择性)。
定期更新统计信息。
十一、MySQL的锁
表锁: 对整个表进行锁定。
行锁: 只锁定当前行, InnoDB 使用的类型。
意向锁: 支持建立非阻塞的事务处理。
共享锁: 允许并发读取。
排他锁: 阻止其他事务读取和写入。
乐观锁:假设出现冲突的可能性较低 在操作完成之前不会对数据加锁
悲观锁:假设出现冲突的可能性很高 在操作之前就对数据加锁
注:
update使用行级锁 因为mysql通过行结构存储数据
十二、判断SQL优化
执行时间过长。慢查询日志 explain分析
查询的行数远大于实际使用的行数。
使用了复杂的 JOIN 或子查询。
锁争用,导致性能下降。
频繁的全表扫描。
十三、MySql的分库分表
性能优化:
-
数据量过大:随着数据量的增加,单个数据库表的查询和写入性能可能会下降。分表可以将数据水平切分,每个表只包含一部分数据,从而提高查询效率。
-
索引效率:较小的表可以提高索引的效率,从而加快查询速度。随着表越来越大,索引变得庞大,查找性能会受到影响。
并发处理:
提升并发能力:分库分表可以将请求分散到多个数据库或表上,从而让多个请求并行处理,提升系统的整体并发性能。
可扩展性:
横向扩展:当数据量增加时,通过分库分表可以简化扩展。新的写入请求可以通过负载均衡分配到不同的数据库实例上,提高系统的扩展性。
时机:
-
单表数据量:超过500万行(根据硬件调整)
-
并发瓶颈:QPS超过2000且无法通过扩容提升
-
存储限制:单表数据量接近服务器存储上限