程序员你真的了解SQL索引吗?

发表于:2010-12-21 10:17

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:姜敏(cnblogs)    来源:51Testing软件测试网采编

  这篇主要来分析下索引的优缼点,以及如何正确使用索引。

  索引的优点:这个显而易见,正确的索引会大大提高数据查询,对结果进行排序、分组的操作效率。

  索引的缺点:优点显而易见,同样缺点也是显而易见:

  1:创建索引需要额外的磁盘空间,索引最大一般为表大小的1.2倍左右。

  2:在表数据修改时,例如增加,删除,更新,都需要维护索引表,这是需要系统开销的。

  3:不合理的索引设计非但不能利于系统,反而会使系统性能下降。例如我们在一个创建有非聚集索引的列上做范围查询,此列的索引不会起到任何的优化效果,反而由于数据的修改而需要维护索引表,从而影响了对数据修改的性能。

  实际例子:还是拿前两篇文章的学生表来讲吧,要查询成绩在50分以上的学生信息select * from student where score>50。学生表包含了100000行记录,而且学分是随机生成的,这样从数据量以及数据分布上都有一定的保障。

  第一种情况:学生表有索引

  1:存在聚集索引,但聚集索引不在学分上,这里只分析学分不是聚集索引的情况。

  (1):学分上没有索引。此时SQL会通过聚集索引来查找数据,这点估计大家都会知道。

  (2):学分上有索引。这种情况,SQL会使用上学分上的索引吗?这个问题估计不是每个人都能回答正确的。既然学分上有索引,而where中又有此列,理应使用了索引,但实际情况并没有使用索引。因为出现了范围查找,如果一个索引一个索引的比较,在性能上比起直接按聚集索引查找全部数据后再过滤来的差。那学分上的索引什么时候  SQL会优先考虑呢?当score指定为一个具体值时,就能使用学分索引查找了。从下图的SQL执行计划可以得知。

  2:不存在聚集索引。

  (1):在学分上没有索引,其它字段有索引,这种情况就会出现表扫描。

  (2):在学分上有索引,是否会按照学分上的索引进行查找呢?由于上面的表数据量也不少,一般会认为SQL不会采用表扫描,因为会查找全部记录,但实际情况表明SQL对于范围查询也行采用表扫描而不是按学生索引查询。我们也可以强制SQL按学分查询,于是有下面的SQL执行计划比较,我们可以清楚的看出,强制使用学分做为索引查询比表搜索的性能要差很多。

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号