优化总结
- 代码层面优化
- 尽量使用索引字段
- 避免 SELECT *,避免在 SELECT 中使用子查询
- 尽量减少 JOIN 操作,必要时时候使用子查询或临时表
- 小表驱动大表
- 数据库层面
- 合理设计表结构,避免冗余
- 数据分区分表
- 冷热数据分离,冷数据进行数据归档
- 系统架构层面
- 读写分离
- 使用缓存存储热点数据
- 硬件层面
- 提高硬件性能
优化细节
避免在 SELECT 子句使用子查询
1SELECT2 CustomerID,3 (SELECT SUM(TotalAmount) FROM Orders WHERE CustomerID = 1001) AS TotalSpent4FROM Customers5WHERE CustomerID = 1001;尽量减少 JOIN 操作
例子:使用 EXISTS 子查询代替 JOIN
我们想要查询所有下过订单的用户。通常,我们会使用 JOIN 操作:
1SELECT u.* FROM users u2JOIN orders o ON u.id = o.user_id;3
4-- 但我们可以使用EXISTS子查询来达到同样的目的:5
6SELECT u.* FROM users u7WHERE EXISTS (SELECT 1 FROM orders o WHERE u.id = o.user_id);小表驱动大表
例子:我们拥有客户表和订单表,订单表数据量大,我们使用客户表来作为主表,对订单表进行关联查询
1SELECT o.order_id, o.order_amount, c.customer_name2FROM customers c3JOIN orders o ON c.customer_id = o.customer_id;数据分区分表
- 数据分区:表分区可以根据某些条件(例如时间、ID 范围等)将数据分割到多个表中,查询时只访问相关的分区,减少了全表扫描的开销。一般分布式数据库天生支持数据分区,通常的数据库,分区策略设计复杂,需要考虑事务一致性等问题。
- 水平拆分:将数据分散到多个独立的表或数据库中,通常基于某种规则(如 ID、区域、日期等)。每个表包含数据的一个子集,可以提高查询效率。
- 垂直拆分:垂直拆分是将一个大表按照列的不同将其分成多个小表,每个小表中包含相同的行,但列数不同。使用时按需进行 JOIN 连接。