IT技术网www.itjs.cn

当前位置:首页 > 数据库 > MySQL > 程序员你真的了解SQL索引吗?

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

发布时间:2010-12-20 09:26 来源:未知

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

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

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

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

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

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

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

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

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

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

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

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

2:不存在聚集索引。

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

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

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

第二种情况:学生表没有索引。这个情况没有分析的价值。

什么字段不适合创建索引?

1:不经常使用的列,这种索引带来缺点远大于带来的优点。

2:逻辑性的字段,例如性别字段等等,匹配的记录太多,和表扫描比起来不相上下。

3:字段内容特别大的字段,例如text等,这会大大增大索引所占用的空间以及索引更新时的速度。