利用索引和表扫描原理优化查询SQL语句


  1. 优化sql语句:

  1. select s_no,snamefrom student s where s_no in (select a.s_no from sc a, sc b where a.c_no='1'and b.c_no='2' and a.s_no=b.s_no);

sc表有唯一联合索引s_noc_nos表有主键s_no,该语句查看执行结果如下:

执行顺序为a,b,s,可看出对sc asc b表的查询都是唯一性索引扫描,对student表进行全表扫描,如果student表数据量很大,结果集只是很少的行,该sql效率会很低。假设student表数据量很大,结果集只是很少的行,优化后的sql如下:

selects.s_no,sname from Student s,(select a.s_no from SC a, SC b where a.s_no=b.s_noand a.c_no='1' and b.c_no='2' ) as c where s.s_no=c.s_no;

查看执行计划如下:

    执行顺序为a,b,derived2,s,其中derived2c表,对a表进行index类型查找,只遍历索引树,对b表进行唯一索引扫描,对c表进行全表扫描,对student进行唯一索引扫描,所以,此sql适用于student表数据量很大,结果集很小;第一个sql适用于student表数据量和结果集数据量差距较小时。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值