待优化的SQL
SELECT
jcaj.c_id,
jcaj.c_ajbh,
jcaj.c_ajmc,
jcaj.c_jyaq,
jcaj.c_ajlb,
jcaj.c_zbdw,
jcaj.c_zbdwmc,
jcaj.d_lasj,
jcaj.c_zbr,
jcaj.c_zbrmc,
jcaj.c_ajzt
FROM db_yw.t_aj jcaj
LEFT JOIN db_yw.t_dqdw_mapping mapp ON mapp.c_corp_id = jcaj.c_zbdw
WHERE mapp.c_district_code = '6'
ORDER BY jcaj.d_lasj desc nulls last ,jcaj.c_id desc
LIMIT 10 OFFSET 0
数据量大小db_yw.t_aj为60万,t_dqdw_mapping为一千多,这条SQL为什么执行的时间非常慢。
查看执行计划:发现没有任何索引走的是全表扫描,所以第一想法是加索引。
第一次加索引 create index index_a on db_yw.t_aj(d_lasj,c_id),发现索引不走。通过查阅资料发现,
asc|desc 和nulls last | nulls first的默认关系,所以第一个索引等同于
create index index_a on db_yw.t_aj(d_lasj asc nulls last,c_id asc nulls last),
此索引的顺序与我们SQL语句中的order by 的顺序不一致,所以导致索引不走。
改进后:
create index index_a on db_yw.t_aj(d_lasj desc nulls last,c_id desc);
总结:当order by和nulls first|last一同出现时,建立的索引要和SQL语句中的条件保持一致。