转载
高效数据库访问--索引篇
关系数据库系统是目前应用最广泛的数据库系统,本文介绍如何使用索引来建立高效的数据库查询,分别解释以下问题。
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、 不能过渡使用索引。过渡使用索引会使数据修改时性能下降,这也是索引的代价,只是优点盖过了缺点。索引必须和数据保持一致,因此在修改数据时必须同时维护索引,对于那些修改非常频繁的表来说,索引不能太多。
高效数据库访问是个很大的主题,本文只介绍了索引,同时也作为自己对索引的一个总结。
阅读(832) | 评论(0) | 转发(0) |