数据库索引以及exists,in的学习

本文分为两个部分,第一部分是谈聚簇索引和非聚簇索引,第二部分谈sql中exists和in的用法

第一部分

首先这两个都是索引,索引一般用在表中某些需要频繁读取的字段上,这是考虑到对表的写操作时要同时更新这些索引,有性能损耗。

聚簇索引:如果有n条数据,就有n个索引项,以B+树方式存在磁盘上。叶子节点存放的是所有实际的数据,这些数据同时是物理连续的。可以在logn的时间内找到结果,同时也可以按序遍历(不使用索引)。但在插入删除时,如果填充因子设置的太大(100%)时,可能会进行大量数据的磁盘移动。

非聚簇索引:和聚簇类似,不过叶节点存放的是所有实际数据的id和它的指针。因此它的缺点是当访问数据时,要比聚簇索引方式多查找一次(多一次通过指针查找到数据的实际位置)。但是由于是指针,所以它的实际数据可以分散的存储到硬盘的各个位置,同时更新操作时只要移动id和相应的指针就行了,不用移动实际数据。

参考:

http://www.cnblogs.com/tmyh/archive/2010/09/29/sqlindex_01.html


第二部分

首先说in和exists的用法

in:可以使用where id in(……)的方式,后面接的是一个查询结果,类似一个集合,例如select id…或者(1,2,3),返回的也是一个集合。

exists:可以使用where exists(……)或者and exists(……)的方式,只要括号里返回结果不为空,exists就返回true,否则为false。

这两个都是子查询,不过对于in,是先执行in子句,然后再和主查询链接,得到查询结果。

对于exists,先执行主查询,然后对每条查询记录,在exists中判断是否为true,如果是true则保留这条记录,否则舍弃这条数据,最后返回整个查询结果。


总结:对于主查询里的为表A,子查询里的表为B。当子查询表B小时,用in比较好,因为先执行B可以减少比较次数(这里可能不是很对,但大概就是这意思)。当主查询表A小时,用exists比较好。

参考:

http://bbs.csdn.net/topics/310148714

http://bbs.csdn.net/topics/90160079
























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值