Chinaunix首页 | 论坛 | 博客
  • 博客访问: 479154
  • 博文数量: 83
  • 博客积分: 2570
  • 博客等级: 少校
  • 技术积分: 901
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-19 12:05
文章分类

全部博文(83)

文章存档

2012年(1)

2011年(1)

2010年(8)

2009年(14)

2008年(45)

2007年(14)

我的朋友

分类: Mysql/postgreSQL

2007-08-07 16:12:52

转载  
  高效数据库访问--索引篇                
           
    关系数据库系统是目前应用最广泛的数据库系统,本文介绍如何使用索引来建立高效的数据库查询,分别解释以下问题。  
   
  1、从关系数据库结构来分析查询的内部处理。  
   
  2、索引能解决什么问题?  
   
  3、如何选择索引字段?  
   
  4、如何使用好索引?  
   
    一、                       从关系数据库结构来分析查询的内部处理。    
   
  从组织结构上来看,关系数据库都是由集合组成:数据库是表的集合,表是元组的集合。一个表就是一个关系,对关系的操作有选择、投影、连接。所以我们的查询操作其实就是关系操作。  
   
    例如有表:顾客表,有10000行记录,我们知道集合是无序的,现在我们需要查询姓名为“张三”的顾客,数据库管理系统就必须完全顺序扫描表,即浏览10000次。  
   
  例如还有顾客购物历史表:顾客购物历史表,有10000行记录,现在我们需要查询姓名为“张三”的顾客的购物历史记录,数据库管理系统首先按“顾客表”完 全顺序扫描,每浏览一行顾客表记录,就按顾客号完全顺序扫描“顾客购物历史表”以查询购物历史记录。执行这个查询的浏览次数是:10000   x   10000   =   1亿次,假设每个表的记录数是一百万行呢?所以这样的查询效率是无法忍受的。  
   
  二、                       索引能解决什么问题?    
   
  索引是一种快速查询技术,数据库管理系统主要使用索引来解决查询效率问题。例如我们在顾客表中按“姓名”建立索引,索引是排序的,当需要查询姓名为“张 三”的顾客时,数据库管理系统可以使用b树进行查找,假设找到了3条记录,起始序号为201,则扫描到204序号时发现姓名大于“张三”,退出扫描。  
   
  我们分别给顾客表、顾客购物历史表加上顾客号的索引,当需要查询姓名为“张三”的顾客购物历史记录时,数据库管理系统首先通过姓名索引在“顾客表”中找出 姓名为“张三”的顾客记录,然后通过顾客号索引到“顾客购物历史表”中找出相应顾客号的购物历史记录,查询处理完毕。  
   
    三、如何选择索引字段?  
   
  索引对选择、连接有效,对投影无效。  
   
  1、         所以在选择索引字段时,应选择where子句后面的字段或连接条件中的字段,而不应该选择select   后面的字段。在多个字段之间选择时应尽量使用多值的字段,如果使用值只有f、m的字段作为索引,无论如何都会返回近一半的数据回来,达不到好的效果。  
   
  2、         尽量使用短索引。因为在进行索引重构时短索引需要更短的时间。  
   
  四、如何使用好索引?  
   
  1、         应该在where子句中或连接条件中直接使用索引字段,如果在表达式或函数中使用索引字段,那么索引将无效,因为每一行的值都需要重新计算。  
   
  2、         尽量使用左边的字段。例如有的复合索引,则在查询条件中使用:  
   
  城市  
   
  城市、邮编  
   
  城市、邮编、年龄  
   
  该索引都有效,如果使用邮编、年龄或年龄作为查询条件则该索引无效。  
   
  3、         不能过渡使用索引。过渡使用索引会使数据修改时性能下降,这也是索引的代价,只是优点盖过了缺点。索引必须和数据保持一致,因此在修改数据时必须同时维护索引,对于那些修改非常频繁的表来说,索引不能太多。  
   
      高效数据库访问是个很大的主题,本文只介绍了索引,同时也作为自己对索引的一个总结。  
阅读(801) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~