LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

SQL提速秘籍:从入门到精通的21个实用技巧

admin
2025年8月19日 12:14 本文热度 57

SQL性能优化不是一蹴而就的任务,而是一个持续观察、分析、实验、验证的闭环过程

  • 我们从 EXPLAIN 开始,但不要止步于 EXPLAIN
  • 我们要相信数据,但不要迷信工具。
  • 我们学习实践指南,但要理解其背后的原理。
  • 我们追求极致性能,但不忘系统的可维护性与可读性。

SQL性能优化是一场没有终点的旅程。我们不仅要写出更快的SQL,更要有系统性思维与平衡智慧。下面,我们将从基础语法优化、索引与执行计划、架构与扩展、安全与运维、新兴技术(AI/向量)、场景化专题、认知与反模式及跨系统协同等方面开始我们的SQL性能优化旅程。

我们先回顾一下SQL性能优化基本原则
1、度量驱动优化:以慢查询日志、监控指标为准绳,避免凭直觉调优。
2、二八法则:优先优化20%的高频慢查询,解决80%的性能瓶颈。
3、避免过度优化:权衡索引、缓存、反范式等带来的读写开销。
4、迭代式优化:持续“监控 → 分析 → 优化 → 验证”,形成闭环。

接下来,我们逐一介绍SQL性能优化要点(不作具体展开),仅供参考:

1、查询语句优化

(1)避免 SELECT *

  • 明确指定所需字段,减少I/O、网络传输和内存使用。
    ✅ 推荐:SELECT name, age FROM users WHERE id = 1;
    ❌ 避免:SELECT * FROM users;

(2)WHERE 条件优化

  • 避免对字段使用函数或表达式,防止索引失效:
    ❌ WHERE YEAR(create_time) = 2024
    ✅ WHERE create_time >= '2024-01-01' AND create_time < '2025-01-01'
  • 使用 SARGable(可搜索参数)条件,如:=><BETWEENIN

(3)JOIN 优化

  • 优先使用 INNER JOIN(性能高于 LEFT JOIN,因只返回匹配行)。
  • 确保关联字段有索引,尤其是外键。
  • 尽量减少 JOIN 数量,避免“N+1查询”问题。
  • 考虑小表驱动大表(驱动表先过滤)。
2、索引优化

(1)合理创建单列索引

  • 为高频查询、排序、连接字段建立索引(如:emailstatuscreated_at)。

(2)复合索引设计(最左前缀原则)

  • 索引 (A, B, C) 可用于:
    • WHERE A = ?
    • WHERE A = ? AND B = ?
    • WHERE A = ? AND B = ? AND C = ?
  • 但不能用于 WHERE B = ? 或 WHERE C = ?
  • 建议顺序:选择性高的字段在前,等值查询在前,范围查询在后。

(3)定期维护索引

  • 重建碎片化索引(MySQL:OPTIMIZE TABLE;PostgreSQL:REINDEX)。
  • 更新统计信息(见第13条)。
3、数据库设计优化

(1)范式与反范式权衡

  • 正常情况遵循 3NF,减少冗余。
  • 性能敏感场景可适度反范式,如:
    • 缓存用户姓名到订单表(避免频繁 JOIN)。
    • 预计算统计值(如:订单总数)存入汇总表。

(2)分区表(Partitioning)

  • 适用于超大表(千万级以上)。
  • 常见策略:按时间范围(Range)、哈希(Hash)、列表(List)分区。
  • 示例:PARTITION BY RANGE (YEAR(order_date))
  • ⚠️ 注意:分区键应与查询条件一致,否则无法实现“分区裁剪”。
4、数据库配置优化

(1)内存调优

  • MySQL: 增大 innodb_buffer_pool_size(建议设为物理内存的 70%-80%)。
  • PostgreSQL: 调整 shared_bufferswork_memmaintenance_work_mem

(2)并发与连接管理

  • 合理设置最大连接数(max_connections),避免连接风暴。
  • 使用连接池(如:HikariCP、Druid)复用连接。
  • 启用线程池(Thread Pool)减少上下文切换。
5、执行计划分析(EXPLAIN)

(1)使用 EXPLAIN 查看执行路径

  • 关注字段:type(访问类型)、key(使用索引)、rows(扫描行数)、Extra
  • 理想类型:const > eq_ref > ref > range > index > ALL(全表扫描应避免)。

(2)进阶:EXPLAIN ANALYZE(真实执行)

  • 返回实际执行时间、行数,用于发现估算偏差。
  • 关注:
    • rows vs actual rows 差异大 → 更新统计信息。
    • Using temporary; Using filesort → 优化排序或添加索引。
    • Using index → 覆盖索引命中,无需回表,性能优。
6、批量操作减少交互

(1)批量插入

INSERT INTO users (name, age) VALUES ('A', 20), ('B', 25), ('C', 30);

比逐条插入快数倍至数十倍。

(2)批量更新/删除

  • 使用 CASE 实现多值更新:
    UPDATE users 
    SET status = CASE id WHEN 1 THEN 'A' WHEN 2 THEN 'B' END
    WHERE id IN (1, 2);
  • 或使用 IN + 批量参数。

(3)ORM 批量支持

  • MyBatis: <foreach> + Executor.BATCH
  • JPA/Hibernate: 设置 hibernate.jdbc.batch_size=50 并禁用二级缓存。

优势:降低网络往返、事务开销、日志写入频率,提升吞吐量。

7、查询缓存减轻数据库压力

(1)应用层缓存(Redis/Memcached)

  • 缓存热点数据:字典表、配置项、用户权限、商品详情。
  • 设置 TTL(如:5-30 分钟),防缓存雪崩(加随机过期时间)。

(2)缓存策略

  • Cache-Aside(旁路缓存):最常用。
    • 读:先查缓存 → 未命中 → 查 DB → 写缓存。
    • 写:先更新 DB → 删除缓存(推荐“先写库后删缓存”)。
  • Write-Through:写请求同步更新缓存与数据库(需缓存支持)。
  • Write-Behind:异步写入,适合高并发写场景。

(3)缓存一致性

  • 更新数据库后,及时 失效缓存(删除而非更新)。
  • 可结合 Binlog + 消息队列实现缓存自动刷新(如: Canal + Kafka)。
8、数据类型与表结构细节优化

(1)选择合适数据类型

  • 数值:TINYINT(状态码)、INT(主键)、BIGINT(防溢出)。
  • 字符串:VARCHAR(n) 明确长度,避免 TEXT 存短文本。
  • 时间:DATETIME vs TIMESTAMP(注意时区与范围)。

(2)避免 NULL

  • NULL 增加索引复杂度、占用额外存储。
  • 建议:用默认值替代(如:''0'1970-01-01')。
  • 定义字段时加 NOT NULL DEFAULT ...
9、子查询与临时表优化

(1)子查询转 JOIN

  • 非相关子查询可改写为 JOIN,提升执行效率。
  • 示例:
    -- 改写前
    SELECT * FROM users WHERE id IN (SELECT user_id FROM orders);
    -- 改写后
    SELECT DISTINCT u.* FROM users u JOIN orders o ON u.id = o.user_id;

(2)合理使用临时表

  • 中间结果复用时,创建临时表并建索引。
  • MySQL:CREATE TEMPORARY TABLE tmp (...)
  • 注意:临时表生命周期为会话级。
10、事务与锁优化

(1)控制事务粒度

  • 避免长事务(长时间持有锁)。
  • 拆分大事务为多个小事务,及时提交。

(2)避免锁升级

  • 更新/删除务必走索引,否则可能全表扫描并升级为表锁。
  • 示例:DELETE FROM logs WHERE status = 0 → 确保 status 有索引。

(3)死锁预防

  • 多表操作按固定顺序访问。
  • 设置合理超时(innodb_lock_wait_timeout)。
11、读写分离与分库分表

(1)读写分离

  • 主库写,从库读(一主多从)。
  • 使用中间件(如:MyCat、ShardingSphere)或代理(如:MaxScale)自动路由。

(2)分库分表

  • 垂直拆分:按业务拆分库(用户库、订单库)。
  • 水平拆分:按主键哈希或范围拆分表(如:user_0 ~ user_9)。
  • 推荐框架:Apache ShardingSphere、Vitess。
12、深度执行计划分析进阶
  • 使用 EXPLAIN ANALYZE 获取真实执行耗时。
  • 关键指标:
    • rows vs actual rows:偏差大 → 更新统计信息。
    • Using temporary / Using filesort:考虑索引优化。
    • Using index:覆盖索引命中,性能佳。
13、统计信息与查询优化器

(1)及时更新统计信息

-- MySQL
ANALYZE TABLE users;

-- PostgreSQL
VACUUM ANALYZE users;

数据量变化大时必须执行,否则优化器可能选错执行计划。

(2)直方图(Histogram)

  • MySQL 8.0+ 支持 CREATE HISTOGRAM,用于非均匀分布字段。
  • 对 WHERE age BETWEEN 30 AND 50 类查询优化显著。
14、高级索引策略

(1)函数索引(表达式索引)

CREATE INDEX idx_lower_name ON users (LOWER(name));
-- 可优化:WHERE LOWER(name) = 'alice'

(2)索引条件下推(ICP)

  • MySQL 将 WHERE 条件下推至存储引擎,减少回表。

(3)多范围读(MRR)

  • 将随机 I/O 转为顺序 I/O,提升范围查询性能。
15、锁机制与并发深度优化

(1)乐观锁(版本号)

UPDATE products SET stock = stock - 1, version = version + 1 
WHERE id = 100 AND version = 5;

成功返回影响行数1,失败则重试。

(2)跳过锁等待

SELECT * FROM queue_table FOR UPDATE SKIP LOCKED; -- 获取可用任务
-- 或 NOWAIT:立即报错而非等待
16、数据类型与存储引擎细节

(1)数值优化

  • TINYINT 存状态(0/1),节省空间。
  • 自增主键用 BIGINT UNSIGNED(上限约42亿亿,防溢出)。

(2)JSON 字段索引

ALTER TABLE orders ADD COLUMN user_id INT AS (JSON_VALUE(details, '$.user_id'));
CREATE INDEX idx_user_id ON orders(user_id);
17、分页查询优化

(1)避免大偏移分页

-- 慢:OFFSET 1000000
SELECT * FROM users ORDER BY id LIMIT 10 OFFSET 1000000;

-- 快:游标分页
SELECT * FROM users WHERE id > 1000000 ORDER BY id LIMIT 10;

(2)延迟关联(Deferred Join)

SELECT u.* FROM users u
INNER JOIN (
  SELECT id FROM users ORDER BY name LIMIT 1000000, 10
) tmp ON u.id = tmp.id;
18、分布式数据库优化要点

(1)分片键选择

  • 高基数、均匀分布(如:user_id 哈希)。
  • 避免热点(如:按 created_at 分片 → 写集中)。

(2)全局索引 vs 本地索引

  • 全局索引:跨分片查询快,但维护成本高。
  • 本地索引:仅在单分片有效,需广播查询。

(3)跨分片查询优化

  • 冗余关键字段(如:用户名复制到订单表)。
  • 异步聚合(定时生成报表写入汇总表)。
19、云数据库特有优化

(1)读写分离代理

  • AWS RDS Proxy、云 RDS 读写分离、Azure Read Scale-out。

(2)Serverless 自动伸缩

  • Aurora Serverless v2:根据负载自动调整 ACU(Aurora Capacity Unit)。

(3)冷热数据分层

  • 热数据:SSD 存储,高频访问。
  • 冷数据:归档至对象存储(S3、OSS),通过 Athena/DLF 查询。
20、硬件与系统层优化

(1)SSD 替代 HDD

  • OLTP 场景必须使用 SSD,IOPS 提升百倍。

(2)NUMA 绑定

  • 将数据库进程绑定到特定 NUMA 节点,减少跨节点内存访问延迟。

(3)禁用透明大页(THP)

echo never > /sys/kernel/mm/transparent_hugepage/enabled

MySQL/PostgreSQL 官方建议关闭,避免内存延迟抖动。

21、监控与持续优化体系

(1)关键监控指标

指标
健康值
工具
慢查询率
< 1%
slow_query_log
缓存命中率
> 95%
InnoDB Buffer Pool Hit Rate
锁等待时间
< 100ms
performance_schema
复制延迟
< 1s
Seconds_Behind_Master

(2)自动化工具

  • MySQL: pt-query-digest(慢日志分析)、pt-online-schema-change(在线DDL)
  • PostgreSQL: pg_stat_statementspgBadger
小结:优化路径建议

阶段
措施
初级
避免 SELECT *、加索引、用 EXPLAIN
中级
批量操作、缓存、分区、读写分离
高级
分库分表、分布式架构、云原生优化、自动化监控

建议:从慢查询日志入手,结合执行计划监控数据,逐层深入,持续迭代。

在以上《SQL性能优化:从入门到精通的21个实用技巧》基础上,下面,从安全与运维、新兴实践场景、认知误区及跨系统协同等方面,我们进一步探索SQL性能优化:

22、SQL注入防护与安全优化

性能优化不能以牺牲安全为代价。恶意SQL注入不仅威胁数据安全,也可能通过复杂查询拖垮数据库。

(1)使用预编译语句(Prepared Statements)

  • 参数化查询是防御SQL注入的根本手段。
  • 示例(Java JDBC):
    String sql = "SELECT * FROM users WHERE email = ? AND status = ?";
    PreparedStatement pstmt = connection.prepareStatement(sql);
    pstmt.setString(1, userEmail);
    pstmt.setInt(2, status);

(2)输入验证与过滤

  • 对用户输入进行白名单校验(如:邮箱格式、长度限制)。
  • 避免动态拼接SQL字符串。

(3)最小权限原则

  • 应用数据库账户应仅拥有必要权限(如:SELECTINSERT),避免使用 root 或 DBA 账号连接。

(4)慢查询与异常行为监控

  • 监控异常长查询、高频失败登录、大量 UNION SELECT 尝试,可能是攻击前兆。
23、Online DDL(在线结构变更)与零停机运维

大表加索引、改字段类型等操作若处理不当,会导致锁表、服务中断。

(1)MySQL Online DDL 特性(5.6+)

  • 支持 ALTER TABLE ... ADD INDEX 等操作不阻塞 DML(需满足条件)。
  • 使用 ALGORITHM=INPLACE, LOCK=NONE 显式控制。

(2)第三方工具

  • pt-online-schema-change(Percona Toolkit):
    • 创建影子表 → 同步数据 → 原子切换。
    • 支持大表无锁变更。
  • gh-ost(GitHub):
    • 基于 Binlog 的无触发器在线迁移,更安全轻量。

(3)实践指南

  • 非高峰时段执行。
  • 提前评估空间需求(临时文件可能占双倍空间)。
  • 监控复制延迟,避免主从压力失衡。
24、时序数据与列式存储优化(HTAP场景)

针对日志、监控、IoT等高频写入、聚合查询场景,传统行存RDBMS效率低。

(1)专用时序数据库

  • InfluxDBTimescaleDB(基于PostgreSQL)、TDengine
  • 特性:高压缩比、高效时间窗口聚合、自动数据过期(TTL)。

(2)列式存储优势

  • 聚合查询(SUMAVGGROUP BY)只需读取相关列,I/O极低。
  • 适合OLAP分析型负载。

(3)HTAP架构

  • 同一数据库同时支持OLTP(事务)与OLAP(分析)。
  • 如:TiDBOceanBaseAurora with Aurora Parallel Query
  • 实现“实时分析”,避免ETL延迟。
25、AI赋能的数据库自动调优(Autonomous Database)

云厂商和数据库社区正推动AI/ML在数据库优化中的应用。

(1)自动索引推荐

  • Oracle Autonomous Database:自动分析工作负载,创建/删除索引。
  • Azure SQL Database:提供索引建议(Index Advisor)。
  • 云 DAS(数据库自治服务):智能索引优化、SQL限流。

(2)自动参数调优

  • 基于负载模式自动调整 buffer_pool_sizework_mem 等参数。
  • 减少人工“调参”成本。

(3)异常检测与自愈

  • 利用机器学习识别慢查询模式、连接异常、性能拐点。
  • 自动执行 KILL QUERY、切换只读副本、扩容资源。

(4)未来趋势

  • “Self-Driving Database”:从监控 → 分析 → 决策 → 执行全自动闭环。
26、绿色计算与能耗优化(可持续性视角)

随着“双碳”目标推进,数据库的能耗也成为优化维度。

(1)减少无效计算

  • 优化慢查询 = 减少CPU空转 = 降低功耗。
  • 避免全表扫描、笛卡尔积等高耗能操作。

(2)冷热数据分离

  • 热数据放SSD(高性能),冷数据归档至HDD或对象存储(低功耗)。
  • 设置生命周期策略自动迁移。

(3)资源弹性伸缩

  • 云上使用Serverless或自动伸缩组,按需分配资源,避免资源闲置浪费。

(4)数据中心级优化

  • 选择使用绿色能源的数据中心。
27、可观测性增强:分布式追踪与SQL上下文关联

在微服务架构中,单个请求可能触发多个SQL,需端到端追踪。

(1)集成分布式追踪系统

  • 使用 OpenTelemetryJaegerSkyWalking
  • 将SQL执行时间、执行计划与HTTP请求链路关联。

(2)实现方式

  • ORM框架(如:MyBatis、Hibernate)插件注入Trace ID。
  • 数据库代理层(如:ShardingSphere-Proxy)记录SQL上下文。

(3)价值

  • 快速定位“哪个API调用导致了慢查询”。
  • 分析SQL在整体调用链中的耗时占比。
28、多模数据库与混合查询优化

现代应用常需处理结构化、半结构化、非结构化数据。

(1)JSON/Document 型查询优化

  • MongoDB:合理使用 covered queries(覆盖查询),避免 FETCH 阶段。
  • PostgreSQL:JSONB + GIN 索引,支持高效路径查询。
    CREATE INDEX idx_orders_jsonb ON orders USING GIN (details);
    -- 查询:SELECT * FROM orders WHERE details @> '{"user_id": 123}';

(2)图数据查询优化(Cypher/Gremlin)

  • Neo4j:使用标签(Label)、索引加速节点查找。
  • 避免“深度遍历”导致的组合爆炸,设置最大跳数。

(3)向量相似性搜索优化(AI场景)

  • PostgreSQL + pgvector,MySQL 8.0.34+ 支持向量类型。
  • 使用 HNSW 索引 加速近似最近邻(ANN)搜索。
  • 场景:语义搜索、推荐系统、图像检索。
29、测试与压测驱动的SQL优化

优化不能只靠“看”执行计划,还需“测”出真实性能。

(1)SQL性能基准测试(Benchmarking)

  • 使用 sysbenchHammerDB 模拟高并发OLTP负载。
  • 对比优化前后的 TPS(每秒事务数)响应时间错误率

(2)A/B 测试与灰度发布

  • 对同一SQL的两种写法(或索引策略),在小流量环境下对比性能。
  • 结合APM工具(如:SkyWalking)分析真实用户影响。

(3)故障注入与容灾演练

  • 模拟主库宕机、网络延迟、慢查询风暴,验证读写分离、熔断降级机制。
30、开发与运维协同(DevOps for DB)

数据库优化不仅是DBA的事,需开发、测试、运维共同参与。

(1)SQL准入规范与静态检查

  • 在CI/CD流水线中集成SQL审核工具:
    • Soar
    • Yearning / Archery
    • SQLAdvisor
  • 拦截 SELECT *、无WHERE的UPDATE、缺失索引等高风险SQL。

(2)数据库变更管理(Liquibase / Flyway)

  • 版本化管理DDL脚本,确保环境一致性。
  • 支持回滚、预检查、数据迁移。

(3)容量规划与成本治理

  • 预测数据增长趋势,提前规划分库分表或扩容。
  • 云上数据库成本监控(如:RDS实例费用、存储费用、流量费用)。
31、BI与报表类SQL专项优化

报表查询通常涉及大表JOIN、复杂聚合,是性能重灾区。

(1)预计算与物化视图

  • 将复杂聚合结果预先计算并存储。
    • MySQL:通过定时任务写入汇总表。
    • PostgreSQL / Oracle:支持 MATERIALIZED VIEW
    • ClickHouse:AggregatingMergeTree 引擎。

(2)ROLAP vs MOLAP

  • ROLAP(如:直接查MySQL):灵活但慢。
  • MOLAP(如:预建Cube):快但需ETL,适合固定维度分析。
  • 工具:Apache Kylin、Doris、StarRocks。

(3)分页与导出优化

  • 大数据量导出:使用异步任务 + 分片查询 + 压缩文件。
  • 避免在报表中使用 OFFSET 大分页。
32、数据一致性与最终一致性下的查询设计

在分布式、缓存、读写分离架构中,查询可能读到“旧数据”。

(1)读写一致性策略

  • 强一致性:关键操作后强制走主库(如:订单创建后立即查询)。
  • 会话一致性:同一个用户会话中,写后读走主库。
  • 最终一致性:容忍短暂延迟,如:缓存更新延迟。

(2)版本号或时间戳控制

  • 客户端携带最后更新时间,查询“自某时间以来的变更”。
  • 减少全量拉取,提升效率。

(3)变更数据捕获(CDC)驱动查询更新

  • 使用 Debezium、Canal 捕获Binlog,实时更新搜索索引(Elasticsearch)或缓存。
33、边缘数据库与本地存储优化(端侧SQL)

移动端、IoT设备中也常使用SQLite等嵌入式数据库。

(1)SQLite 性能调优

  • 使用 PRAGMA synchronous = OFF(牺牲安全性换速度,需谨慎)。
  • 启用 WAL 模式(PRAGMA journal_mode = WAL)提升并发。
  • 批量操作用事务包裹:
    BEGIN;
    INSERT ...;
    INSERT ...;
    COMMIT;

(2)索引与VACUUM

  • 频繁删除后执行 VACUUM 回收空间。
  • 合理使用部分索引(CREATE INDEX ... WHERE condition)。

(3)查询编译缓存

  • 复用 PreparedStatement,避免重复解析SQL。
34、认知误区与反模式(What NOT to Do)

有时候,不做错误的事,比“做正确的事”更能提升性能。

反模式
正确做法
说明
盲目添加索引
基于查询频率和数据分布设计
每个索引都增加写开销,且优化器可能不选
认为 ORDER BY 必须有索引
理解排序成本与数据量关系
小结果集排序成本低,无需强加索引
过度使用视图
明确视图用途,避免嵌套多层
视图可能阻止优化器重写,导致性能下降
迷信“覆盖索引万能”
权衡索引大小与查询频率
覆盖索引过宽会导致I/O增加,适得其反
认为分库分表能解决一切
先优化单库,再考虑拆分
拆分带来复杂性,是“解药”也是“毒药”

金句总结

  • “没有银弹,只有权衡。”
  • “最高效的SQL,是根本不需要执行的SQL。”
35、递归查询与层次化数据优化(树形结构)

组织架构、分类目录、评论回复等场景常见。

(1)传统方式:邻接表(Parent ID)

  • 查询子树需递归或程序循环,效率低。
  • 优化:缓存整棵树,前端渲染。

(2)高效方式:闭包表(Closure Table)

  • 预计算所有父子路径,支持快速查询任意层级。
  • 示例表 category_paths
    ancestor
    descendant
    depth
    1
    1
    0
    1
    2
    1
    1
    3
    2
  • 查询“ID=1的所有后代”:WHERE ancestor = 1

(3)其他方案

  • 路径枚举path = '/1/2/3',用 LIKE '/1/%' 查询后代。
  • 嵌套集模型(Nested Set):适合读多写少,写操作代价高。
36、ORM 框架的“性能陷阱”与规避策略

开发者常用 ORM,但其抽象层可能隐藏性能问题。

陷阱
表现
规避方法
N+1 查询问题
查100个用户,触发101次SQL(1次查用户 + 100次查订单)
使用 JOIN FETCH(Hibernate)或 with(Laravel Eloquent)预加载
SELECT * 隐式调用User::find(1)
 默认查所有字段
指定字段:User::select('id', 'name')->find(1)
自动脏检查(Dirty Checking)
Hibernate 每次提交都扫描所有字段
使用 @DynamicUpdate 或改用 DTO 更新
事务边界不清晰
业务方法未显式控制事务,导致长事务
使用 @Transactional 明确边界,避免在循环内开启事务

原则:ORM 是工具,不是黑盒。了解其生成的SQL,才能有效优化。

37、字符集与排序规则(Collation)对性能的影响

看似无关紧要,实则影响索引效率与比较操作。

(1)字符集选择

  • utf8mb3 → utf8mb4(支持 emoji,但空间多1.3倍)
  • 若无需中文/emoji,可用 latin1 或 ascii,节省空间。

(2)排序规则(Collation)

  • utf8mb4_general_ci vs utf8mb4_unicode_ci
    • 前者快但精度低(如:不区分某些语言字符)。
    • 后者准但慢(Unicode标准排序)。
  • 区分大小写:utf8mb4_bin(二进制比较,最快)。

(3)索引使用影响

  • 若 WHERE name = 'Alice',但 name 字段是 utf8mb4_unicode_ci,比较时需执行复杂规则,影响性能。
  • 高频精确匹配场景,推荐使用 _bin 或 _general_ci
38、地理空间查询优化(GIS)

位置服务、附近的人、路径规划等场景。

(1)空间索引

  • MySQL:SPATIAL INDEX + MyISAM 或 InnoDB(8.0+)。
  • PostgreSQL:PostGIS 扩展 + GIST 索引。

(2)高效查询

  • ❌ 避免:WHERE ST_Distance(lat, lng, target) < 1000
  • ✅ 使用:MBRContains() 或 ST_Within()
    SELECT * FROM places 
    WHERE ST_Within(location, ST_Buffer(Point(116.4, 39.9), 1));

(3)Geohash 优化

  • 将经纬度编码为字符串(如:wx4g0),前缀匹配可快速定位区域。
  • 支持前缀查询:WHERE geohash LIKE 'wx4g%'
39、ETL 与批处理作业的SQL优化

数据仓库、报表生成、日终结算等后台任务。

(1)大事务拆分

  • 避免 UPDATE billions_rows SET status = 1 导致锁表和日志爆炸。
  • 改为分批更新:
    WHILE ROW_COUNT() > 0 DO
      UPDATE table SET status = 1 WHERE status = 0 LIMIT 10000;
    END WHILE;

(2)临时表 + 索引

  • 中间结果建临时表并加索引,避免重复计算。

(3)关闭非关键日志

  • 批处理期间临时关闭 binlog(若允许)或使用 sql_log_bin = 0(需谨慎)。

(4)并行处理

  • 按主键分片,并行执行多个子任务(如:id % 4 = 0= 1...)。
40、数据库与操作系统/文件系统的协同优化

性能瓶颈可能不在SQL,而在底层I/O调度。

(1)I/O 调度器选择

  • Linux:deadline 或 noop(SSD场景)比 cfq 更适合数据库。
  • 设置:echo deadline > /sys/block/sda/queue/scheduler

(2)挂载选项优化

mount -o noatime,nobarrier,discard /dev/sdb1 /var/lib/mysql
  • noatime:不更新访问时间,减少写操作。
  • nobarrier:禁用写屏障(SSD安全,HDD慎用)。
  • discard:支持TRIM,提升SSD寿命。

(3)RAID 配置

  • 日志文件(redo log, binlog)用 RAID 10,提升写性能与可靠性。
41、性能优化的“道”与“术”

超越技术细节,上升到方法论与哲学。

层次
内容
术(Technique)
索引、缓存、批量、执行计划
法(Method)
监控驱动、二八法则、迭代优化
道(Principle)
简洁性、可维护性、最小惊喜原则
境(Wisdom)
接受不完美,容忍局部次优,追求系统整体平衡

终极心法

  • “优化的目标不是让SQL变快,而是让系统更健壮。”
  • “最好的性能优化,是让用户感觉不到‘等待’。”
  • “当你觉得一切已优化到极致,请重启监控,重新观察。”

该文章在 2025/8/19 12:14:30 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved