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

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

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

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

分享:

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

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

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

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

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

  我们说SQL在维护索引时要消耗系统资源,那么SQL维护索引时究竟消耗了什么资源?会产生哪些问题?究竟怎样才能优化字段的索引?

  第一:当数据页达到了8K(数据页最大为8K) 容量,如此时发生插入或更新数据的操作,将导致页的分裂。

  1、聚集索引的情况下:聚集索引将被插入和更新的行指向特定的页,该页由聚集索引关键字决定;

  2、只有堆的情况下:有空间就可以插入新的行,对行数据的更新需要更多的空间,如果大于了当前页的可用空间,行就被移到新的页中,且在原位置留下一个转发指针,指向被移动的新行,如果具有转发指针的行又被移动了,那么原来的指针将重新指向新的位置;

  3、堆中有非聚集索引,尽管插入和更新操作,不会发生页分裂,但非聚集索引上仍然产生页分裂。

  总结:无论有无索引,很多数据将保留在老页面,其它将放入新页面,并且新页面可能被分配到任何可用的页,频繁页分裂,表会产生大量数据碎片,直接造成I/O 效率下降。

  引出问题:为什么数据库对于varchar最大值设置为8000,而不是10000呢?

  答:是由于数据页大小最大为8K。

  第二:针对上述索引可能造成的页分页的解决方案,填充因子。

  创建索引时,可以为索引指定一个填充因子,在索引的每个叶级页面上保留一定百分比的空间,将来数据可以进行扩充和减少页分裂。值从0到100的百分比数值,100 时表示将数据页填满。不对数据进行更改时(例如只读表中)才用此设置,实用价值不大。值越小则数据页上的空闲空间越大,可以减少在索引增长过程中进行页分裂,但需要占用更多的硬盘空间。填充因子也不能设置过小,过小会影响SQL的读取性能,因为填充因子造成数据页的增多。一般我们公司设置的填充因子是80。

  索引是否是一尘不变的?

  随着业务的变化,数据的变化,会发生有些索引的用处可能发生变化,例如:

  1:原来主要靠用户名搜索记录,现在业务更改为按用户所在城市搜索等等,此时我们需要即时变更表索引以适应新业务的变化,即数据和使用模式发生了大幅度变化。

  2:系统上线前不合理的索引,随着数据的增加,缺点越来越明显,此时需要调整索引。

  3:随着数据的增加,产生了越来越多的页分裂,导致索引性能越来越低。

  上面的几种情况,我们就需要选择重建索引来彻底解决问题。

  总结索引使用原则:

  1:不要索引数据量不大的表,对于小表来讲,表扫描的成本并不高。

  2:不要设置过多的索引,在没有聚集索引的表中,最大可以设置249个非聚集索引,过多的索引首先会带来更大的磁盘空间,而且在数据发生修改时,对索引的维护是特别消耗性能的。

  3:合理应用复合索引,有某些情况下可以考虑创建包含所有输出列的覆盖索引。

  4:对经常使用范围查询的字段,可能考虑聚集索引。

  5:避免对不常用的列,逻辑性列,大字段列创建索引。

22/2<12
重磅发布,2022软件测试行业现状调查报告~

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号