2020-08-19 09:17:26
SQL调优的常见方式如下:
创建索引优化检索效率
在WHERE及ORDER BY涉及的列上建立索引,优先为高频检索字段(如用户名、部门与岗位组合)创建索引。索引数量需控制,通常不超过6个,避免因索引过多降低INSERT/UPDATE效率(因重建索引导致性能损耗)。例如,对username字段检索频繁时,应单独建索引;若需按部门和岗位联合检索,则创建复合索引。
避免索引列参与计算
若WHERE子句中索引列被函数或算术运算包裹(如WHERE salary*22>11000),数据库优化器将放弃索引而全表扫描。应改写为等价形式(如WHERE salary>11000/22),确保索引列直接参与比较。
使用参数化SQL预编译
参数化SQL通过预编译机制,使数据库首次执行时完成查询优化并缓存执行计划,后续执行直接复用,避免重复解析与优化开销。此方式同时可防御SQL注入攻击,提升安全性与执行效率。
合并多条SQL为单句执行
每次SQL执行均需建立网络连接、权限校验及查询优化,过程耗时。应通过子查询、JOIN或CASE语句将多条逻辑合并为单句,减少网络交互与资源占用。
优先使用WHERE替代HAVING
HAVING在聚合后过滤结果集,而WHERE在聚合前筛选数据。若条件可通过WHERE实现(如非聚合函数过滤),应优先使用,减少数据处理量。例如,将HAVING COUNT(*)>10改写为WHERE id IN (SELECT id FROM ...)。
连接表时使用别名
多表连接时,为表定义别名并前缀列名(如SELECT a.id, b.name FROM user a JOIN department b ON a.dept_id=b.id),可缩短SQL长度、减少解析时间,并避免列名歧义导致的语法错误。
用UNION ALL替代UNION
UNION需合并结果集并去重排序,而UNION ALL直接拼接数据。若确定结果无重复(如分页查询不同范围数据),应使用UNION ALL以省略去重步骤,提升性能。
其他关键优化策略