日期:2014-05-16  浏览次数:20514 次

数据库 索引学习
使用索引的意义
?   索引在数据库中的作用类似于目录在书籍中的作用,用来提高查找信息的速度。
?   使用索引查找数据,无需对整表进行扫描,可以快速找到所需数据。
  使用索引的代价
  索引需要占用数据表以外的物理存储空间。
?   创建索引和维护索引要花费一定的时间。
?   当对表进行更新操作时,索引需要被重建,这样降低了数据的维护速度。
?   创建索引的列
  主键
?   外键或在表联接操作中经常用到的列
?   在经常查询的字段上最好建立索引
  不创建索引的列
?   很少在查询中被引用
?   包含较少的惟一值
?   定义为 text、ntext 或者 image 数据类型的列
  何时创建聚集索引?
  Clustered Index会提高大多数table的性能,尤其是当它满足以下条件时:
1.   独特, 狭窄, 静止: 最重要的条件
2.   持续增长的,最好是只向上增加。例如:
?   Identity
?   Date, identity
?   GUID (only when using newsequentialid() function)

以下情况不要建索引:
? 1、如果每次都需要取到所有表记录,无论如何都必须进行全表扫描了,那么是否加索引也没有意义了。
? 2、对非唯一的字段,例如“性别”这种大量重复值的字段,增加索引也没有什么意义。
? 3、对于记录比较少的表,增加索引不会带来速度的优化反而浪费了存储空间,因为索引是需要存储空间的,而且有个致命缺点是对于update/insert/delete的每次执行,字段的索引都必须重新计算更新
以下情况要建立索引


    SELECT c.companyID, c.companyName FROM Companies c, User u WHERE c.companyID = u.fk_companyID AND c.numEmployees >= 0 AND c.companyName LIKE '%i%' AND u.groupID IN (SELECT g.groupID FROM Groups g WHERE g.groupLabel = 'Executive')
    这条语句涉及3个表的联接,并且包括了许多搜索条件比如大小比较,Like匹配等。在没有索引的情况下Mysql需要执行的扫描行数是77721876行。而我们通过在companyID和groupLabel两个字段上加上索引之后,扫描的行数只需要134行。在Mysql中可以通过Explain Select来查看扫描次数。可以看出来在这种联表和复杂搜索条件的情况下,索引带来的性能提升远比它所占据的磁盘空间要重要得多。