1. 存储过程
存储过程是基于SQL语言的过程化编程扩展,允许将一系列SQL语句封装为一个可执行的程序。通过这种方式,可以提高执行效率,因为存储过程在编译后只需通过调用和参数传递来使用,而无需每次执行时都进行解析和编译。这种特性使得存储过程在处理复杂的业务逻辑和多次重复执行的数据库操作中非常有效。
2. 多版本并发控制(MVCC)
MVCC是一种避免锁机制以提高数据读取效率的方法。它通过保持数据的多个版本来解决线程安全问题,从而允许多个事务并发执行。在MVCC中:
- Undo Log:记录数据修改前的状态,支持事务的回滚。
- 版本链:用于跟踪数据的不同版本。
- Read View:确保事务在读取数据时能够访问到有效的快照。
3. COUNT函数的性能比较
在MySQL中,COUNT(*)
和COUNT(1)
的性能是相同的,通常优于COUNT(主键)
,而COUNT(字段)
会排除NULL值。性能排序如下:
-
COUNT(*)
=COUNT(1)
>COUNT(主键)
>COUNT(字段)
-
COUNT(name)
:统计字段name
不为NULL的记录数。 -
COUNT(1)
:统计表中总记录数,包括NULL值。 -
COUNT(*)
:统计总记录数,包括NULL。 -
COUNT(主键)
:只统计主键列的数量,效率较低。
4. 回表
在使用索引进行查询时,若索引字段未能完全满足查询条件,MySQL将需要通过索引查找后再访问实际数据表进行数据的完整读取,这个过程称为“回表”。虽然使用索引可以加速查询,但回表的过程可能会影响性能。
5. 删除重复数据
在MySQL中,可以通过使用GROUP BY
结合HAVING
语句、使用临时表或子查询来实现删除重复数据,只保留一条。例如:
DELETE t1 FROM table_name t1
INNER JOIN table_name t2
WHERE t1.id > t2.id AND t1.duplicate_column = t2.duplicate_column;
6. MySQL性能调优
- 缓存调优:调整缓冲池大小,引入Redis等缓存机制。
- 硬件升级:增加内存和使用SSD等快速存储设备。
- 垃圾清理:定期清理不再使用的表、数据和缓存,释放资源。
- 选择合适的引擎:例如MyISAM适合读多写少的场景,而InnoDB适合并发写入。
- 读写分离:通过主从同步提高读性能。
- 数据迁移:采用停机迁移和不停机迁移(增量与全量同步)。
7. MySQL日志机制
- Binlog:记录数据库的写操作,以二进制格式存储,支持逻辑恢复。
- Redo Log:记录数据页的修改,以实现故障恢复,属于物理日志。
- Undo Log:用于实现事务的原子性,保存数据修改前的状态,支持回滚操作。
8. 慢查询
慢查询是指执行时间超过long_query_time
参数设定的阈值(例如10秒)的查询。慢查询会被记录在慢查询日志中,以便于后期优化。
9. SQL调优手段
- 合理使用索引。
- 优化查询语句:使用EXPLAIN分析执行计划,避免全表扫描等。
- 调整服务器硬件配置:提高CPU、扩展内存、使用高速磁盘。
- 定期维护数据库:保障数据完整性,进行备份和清理。
- 合理分配资源与连接管理。
- 使用缓存技术:如Redis,缓存热点数据以降低数据库压力。
- 数据分区与分表:将大型数据集分散到多个表和库中以提高查询性能。
- 负载均衡技术:如主从同步,分散请求压力,提高并发性能。
- 优化数据库设计:遵循三范式,避免数据冗余。
- 监控性能和调优。
10. SQL执行顺序
SQL语句的执行顺序为:
FROM > ON > JOIN > WHERE > GROUP BY > AGG_FUNC > HAVING > SELECT > DISTINCT > ORDER BY > LIMIT
11. DISTINCT与GROUP BY的区别
- DISTINCT:用于消除查询结果中的重复记录。
- GROUP BY:用于将结果集中的数据进行分组,通常与聚合函数一起使用。
12. B+树的层数计算
在假设的条件下,计算B+树的层数(假设100万条记录):
- 一页大小为16KB,每个指针和主键占用的空间为14字节(8字节主键 + 6字节指针)。
- 每页存储的指针数为
16*1024 / 14 ≈ 1170
。 - 假设每页能存储16条记录,则可以推算出树的层数。
13. 数据库三范式
- 第一范式:每个字段都是原子的。
- 第二范式:满足第一范式且每行数据必须可唯一识别。
- 第三范式:非主属性必须直接依赖于主键,不能依赖于其他非主属性。
14. SQL约束
- NOT NULL:字段内容不能为空。
- UNIQUE:字段不能重复。
- PRIMARY KEY:标识主键。
- FOREIGN KEY:表与表之间的连接。
- CHECK:控制字段值的范围。
15. DROP、DELETE、TRUNCATE的区别
- DELETE:按条件删除数据,可回滚,速度较慢。
- TRUNCATE:删除表中所有数据,表结构不变,速度快且不可回滚。
- DROP:删除整个表,包括索引和权限,不可回滚,速度最快。
16. 分库分表
- 分表:将一个表的数据分散到多个表中,减少单表负担。
- 分库:将数据库拆分到多个数据库中,增加并发处理能力。
17. 垂直与水平拆分
- 水平拆分:将同一表的数据分散到多个表中,但表结构一致。
- 垂直拆分:将一个表拆分成多个表,每个表包含部分字段。
18. 主从同步与读写分离
主从同步通过在主数据库上执行写操作,并将数据同步到从数据库,实现读写分离,提高性能及数据安全。
19. MySQL数据存储结构
MySQL通过使用不同的存储引擎来存储和管理数据,支持高效的读写操作,满足多种业务需求。