一、避免NULL判断
WHERE子句中对字段进行NULL判断会使索引失效,导致全表扫描。建议字段尽量设为NOT NULL并赋予默认值(如数字默认0)。注意:变长字段(varchar)中NULL不占空间,定长字段(char)无论是否为空都占固定空间。备注、描述等可酌情留NULL。
二、禁用SELECT *
会增加解析成本,返回不必要字段(如text类型),拖慢传输效率。只查询所需字段。
三、谨慎使用模糊查询
LIKE以'%'开头时索引失效;不以'%'开头则索引有效。
四、避免使用列号(如ORDER BY 1)
增加解析开销,可读性差。
五、优先UNION ALL而非UNION
UNION会去重,耗时更多;若业务无重复或允许重复,务必使用UNION ALL。
六、索引列避免计算
WHERE或ORDER BY中对索引列进行运算会使索引失效,应将计算值提前处理好再传入。
七、用NOT EXISTS替代NOT IN
NOT IN导致内外表全表扫描,NOT EXISTS仍可利用索引。
八、EXISTS与IN选择
IN适用外表大、内表小;EXISTS适用外表小、内表大。两表大小相近时性能差异不大。
九、索引列禁忌
避免使用IS NULL / IS NOT NULL,避免数据类型自动转换(如字符串字段传入数值),否则索引失效。
十、复杂SQL拆分
多层嵌套子查询影响性能,可拆分为多条SQL或将部分逻辑交由程序处理,提升可维护性与效率。