最外层SELECT未指定WHERE条件
- Content:SELECT语句没有WHERE子句,可能检查比预期更多的行(全表扫描)。对于SELECT COUNT(*)类型的请求如果不要求精度,建议使用SHOW TABLE STATUS或EXPLAIN替代。
- Case:
select id from tbl
不建议使用ORDER BY RAND()
- Content:ORDER BY RAND()是从结果集中检索随机行的一种非常低效的方法,因为它会对整个结果进行排序并丢弃其大部分数据。
- Case:
select name from tbl where id < 1000 order by rand(number)
不建议使用带OFFSET的LIMIT查询
- Content:使用LIMIT和OFFSET对结果集分页的复杂度是O(n^2),并且会随着数据增大而导致性能问题。采用“书签”扫描的方法实现分页效率更高。
- Case:
select c1,c2 from tbl where name=xx order by number limit 1 offset 20
不建议对常量进行GROUP BY
- Content:GROUP BY 1 表示按第一列进行GROUP BY。如果在GROUP BY子句中使用数字,而不是表达式或列名称,当查询列顺序改变时,可能会导致问题。
- Case:
select col1,col2 from tbl group by 1
ORDER BY常数列没有任何意义
- Content:SQL逻辑上可能存在错误; 最多只是一个无用的操作,不会更改查询结果。
- Case:
select id from test where id=1 order by id