闲话少说,咱们说正事!30种常用的SQL查询语句优化方法
1.尽量避免在where子句中使用!=或运算符,否则引擎将放弃使用索引并执行全表扫描。
2、优化查询,尽量避免全表扫描。 首先考虑对where和order by涉及的列创建索引。
3、尽量避免对where子句中的字段进行空值判断,否则引擎将放弃使用索引而进行全表扫描。 喜欢:
来自 t 的 id,其中 num 为 null
可以对num设置默认值0,确保表中num列不存在空值,然后像这样查询:
来自 t 的 id,其中 num=0
4、尽量避免在where子句中使用or来连接条件,否则引擎会放弃使用索引而进行全表扫描,如:
来自 t 的 id,其中 num=10 或 num=20
你可以这样查询:
来自 t 的 id,其中 num=10
联合所有
来自 t 的 id,其中 num=20
5.以下查询也将导致全表扫描:(百分号前面不能)
来自 t 的 id,其中名称如“%c%”
转到下面的索引
来自 t 的 id,其中名称如“c%”
为了提高效率,可以考虑全文搜索。
6、in和not in也要谨慎使用,否则会导致全表扫描,如:
来自 t 的 id,其中 num in(1,2,3)
对于连续值,如果可以,请不要使用 in:
来自 t 的 id,其中 num 1 和 3
7、如果where子句中使用了参数,也会引起全表扫描。 由于 SQL 仅在运行时解析局部变量,因此优化器无法将访问计划的选择推迟到运行时; 它必须在编译时进行选择。 但是,如果在编译时构建访问计划,则变量的值仍然未知,并且不能用作索引选择的输入。 以下语句将执行全表扫描:
来自 t 的 id,其中 num=@num
您可以强制查询使用索引:
来自 t 的 id with(index(索引名称)) 其中 num=@num
8、尽量避免对where子句中的字段进行表达式操作,这会导致引擎放弃使用索引而进行全表扫描。 喜欢:
来自 t 的 id,其中 num/2=100
应改为:
来自 t 的 id,其中 num=100*2
9、尽量避免对where子句中的字段进行函数操作,这会导致引擎放弃使用索引而进行全表扫描。 喜欢:
id from t where (name,1,3)='abc' – 名称以 abc 开头的 id