パフォーマンスを向上させるために、インデックスを使用する方法

リレーショナルデータベースでは、データテーブル、一般的に無秩序な状態は、対応するインデックスが存在しない場合には、ディスク上に格納され、テーブル内のデータを照会するために、あなただけのテーブル全体を検索することができ、すべてのレコードは、一つ一つが読み、その後にしますクエリの条件、このアプローチは、I / O操作やCPUのコンピューティング・システムは、インデックスが考慮しなければならないとなっている確立すること、そのため、多くの時間を消費するディスクの多くにつながることは明らかです。

:ステートメントが最も一般的に使用されるキーインデックスデータテーブルとして確立することができ、キーインデックスは主にB +ツリーデータ構造を使用して達成は、以下の特性のいくつかを持っているテーブル名(カラム名、......)にINDEX [インデックス名] CREATE使用

図1は、これ以上1以下、ルートノードからリーフノードの深さに、バランスのとれたツリーです。

子供に2、非リーフノードのみ保存ポインタとポインタがキーをノード、データが保存されません。

図3に示すように、リーフノードは、キー値を、対応するレコードリストポインタアドレスとリーフノードを保持し、リーフノードにリンクされたリストは、キーを注文しています

しかし、これらのプロパティは、ユーザーのニーズを満たすために、クエリのパフォーマンスを確保することができるのだろうか?以下は、私たちが銀行に時間がかかることは、インデックスのパフォーマンスの問題を調査するために、例えば、クエリを占めています。

説明の便宜のために、私たちはB +ツリーは、図2に示したB +ツリーです簡素化するためにここにいる、以下に示すように、キーとして数とトランザクションの日付を考慮して。:

 

1558706168072100.png

私たちは2000年1月7日に2000年1月1日から口座A002取引の流れを照会したい場合は、データベースシステムは、最初に何の早い2000-01-01鍵の結果より、A002のためのリーフノードの日付をアカウントに見えるんだろう順次記録アドレスの条件を満たすインデックスキー値を検索し、レコードを読み取るために、ブロック内のインデックス・ブロック、B、C、およびCを読み取る最終ブロックC日付のインデックスがより早い又は等しい場合、返されます2001-01- 07、そのまま大2001年1月7日より索引ブロックまで、特定の日付までようにインデックス列Dのリーフノードに応じてリストを読み、そしてすることが可能です。

观察上述过程,我们发现 2000-01-01 对应的记录在数据页 1,2000-01-02 和 2000-01-03 对应的记录在数据页 2,2000-01-04 对应的记录则在数据页 3,4 条记录需要读取 3 个数据页,极端情况下甚至任意一条记录都在不同的数据页,而此时如果数据区中记录已按键值序存储则可以显著减少磁盘 IO。更进一步,如果记录数据直接保存在叶子节点,则可以减少查询过程中索引页与数据页之间的跳读,这对于机械硬盘的性能影响尤甚。

这些问题对于集算器的组表来说,可以非常轻松地得到解决。

我们还是以股票交易数据为例讲解组表的使用。


A
1 =file("d:/test/stktrade.ctx")
2 =A1.create@r(#sid,#tdate,open,close,volume)
3 =connect("mysql")
4 =A3.cursor("select   * from stktrade order by sid,tdate")
5 =A2.append(A4)
6 =A3.close()
7 =A2.index(idx1;sid,tdate)

A2: 创建数据结构为 (sid,tdate,open,close,volume) 的组表,且指定 sid 和 tdate 为键,@r 指定数据按行存储

A5: 将按 sid 和 tdate 有序的数据追加到组表中

A6: 以 sid 和 tdate 为键值建立索引 idx1


A
1 =file("d:/test/stktrade.ctx").create()
2 =A1.icursor(sid=="600036"   && tdate>=date("2018-01-01") &&   tdate<=date("2018-01-10"),idx1)
3 =A2.fetch()

A1: 读取组表

A2:インデックスIDX1カーソルに応じたクエリデータを定義します

A3:データにカーソルを削除します

   IDX1のインデックスを作成すると、必要な場合もデータは、例えば、開きたい、インデックスに格納されて、ちょうどテーブルの前にもIDX1年インデックスに格納され近い、ボリューム3、どこA2.index(IDX1。 SID、tdate)の代わりにA1.index(IDX1; sidは、tdate;クエリは、データファイルを読み込むことができない場合、唯一のクエリ速く、インデックスファイルを読み込むように、オープン、クローズ、ボリューム)は、することができます。


おすすめ

転載: blog.51cto.com/12749034/2438113