当前位置: 首页 > 科技观察

下面说说如何使用索引来提高性能

时间:2023-03-17 21:58:20 科技观察

在关系型数据库中,表中的数据一般都是以无序的状态存储在磁盘上的。当没有对应的索引时,如果要查询表中的数据,只能使用全表检索,一条一条读取所有记录,然后与查询条件进行比较。显然,这种方式会造成大量的磁盘I/O操作和CPU计算,消耗大量的系统时间。因此,索引成为必须。选项。使用CREATEINDEX[indexname]ontablename(columnname,...)语句为表中的数据创建最常用的key-value索引,key-value索引的实现大多使用B+树型数据结构,具有以下性质:1.是一棵平衡树,即根节点到叶节点的深度差不超过1;2、非叶子节点只存储键值和子节点指针,不存储数据;3.叶子节点存储key值,对应记录的地址和叶子节点的链表指针,链表中的叶子节点是key-value排序的,但是这些属性会不会保证查询性能满足用户的需要?下面我们以银行账户的时间段查询为例。讨论索引性能问题。为了方便说明问题,这里我们将B+树简化为一个3叉B+树,以账号和交易日期为键值,如下图所示:如果我们要从中查询账号A0022000-01-01到2000-01-07的交易流程,数据库系统会先查找帐号为A002且日期不早于2000-01-01的键值所在的叶子节点。结果是依次读取索引块A、B、C,然后找到索引块C如果索引块C中的最后一个日期早于或等于2001-01-07,则可以直接读取索引列D根据叶子节点的链表。依此类推,直到索引块中的日期大于2001-01-07。观察上面的过程,我们发现2000-01-01对应的记录在数据页1,2000-01-02和2000-01-03对应的记录在数据页2,2000对应的记录-01-04在数据页3,4条记录需要读取3个数据页。在极端情况下,甚至任何记录都在不同的数据页中。这时候,如果数据区的记录已经按照key-value的顺序存储,那么磁盘IO就可以明显减少。此外,如果将记录数据直接存储在叶子节点中,可以减少查询过程中索引页和数据页之间的跳转,对机械硬盘的性能造成严重影响。集算器的组表可以轻松解决这些问题。下面以股票交易数据为例,说明分组表的使用。A2:创建数据结构为(sid,tdate,open,close,volume)的组表,指定sid和tdate为key,@r指定数据存储在行中A5:追加按sid和tdate排序的数据tdate到group表A6:以sid和tdate为键值建立索引idx1A1:读取组表A2:根据索引idx1定义查询数据的游标A3:在游标中取数据在建立索引idx1时,也可以将所有需要的数据存储在索引中,例如要在索引idx1中存储open、close、volume这三列,只要将上表中的A2.index(idx1;sid,tdate)改为A1.index(idx1;sid,tdate;open,close,volume),这样查询就可以不读数据文件,只读索引文件,这样查询速度更快。