私は大規模なチャット アプリケーションを作成しています。これが私のデータベース スキーマです。
CREATE CLASS User EXTENDS V;
CREATE PROPERTY User.name STRING;
CREATE CLASS Message EXTENDS V;
CREATE PROPERTY Message.text STRING;
CREATE PROPERTY Message.createdAt DATETIME;
CREATE INDEX Message.createdAt ON Message(createdAt) NOTUNIQUE;
CREATE CLASS Send EXTENDS E;
私は軽量のエッジを使用しており、200,000 のエッジが#12:0
次のように接続されています。
CREATE VERTEX User SET name = 'john';
/* #12:0 */
CREATE VERTEX Message SET content = 'Lorem ipsum dolor sit amet', createdAt = SYSDATE();
/* #20:0 */
CREATE EDGE Send FROM #12:0 TO #20:0
に接続された最後の 5 つのメッセージを取得したい#12:0
。私はこれらのクエリを試しました:
クエリ 1:
SELECT FROM (
SELECT EXPAND(OUT('Send')) FROM #12:0
) ORDER BY createdAt DESC LIMIT 5
〜2秒かかりました
「説明」の結果:
{
"result": [
{
"@type": "d",
"@version": 0,
"documentReads": 200000,
"current": "#19:66661",
"recordReads": 200000,
"fetchingFromTargetElapsed": 377,
"expandElapsed": 0,
"orderByElapsed": 5,
"evaluated": 200000,
"elapsed": 2416.7283,
"resultType": "collection",
"resultSize": 5,
"@fieldTypes": "documentReads=l,current=x,recordReads=l,fetchingFromTargetElapsed=l,expandElapsed=l,orderByElapsed=l,evaluated=l,elapsed=f"
}
],
"notification": "Query executed in 2.427 sec. Returned 1 record(s)"
}
クエリ 2:
SELECT OUT('Send')[199994-199999] FROM #12:0
〜6秒かかりました
「説明」の結果:
{
"result": [
{
"@type": "d",
"@version": 0,
"documentReads": 1,
"current": "#12:0",
"recordReads": 1,
"optimizationElapsed": 0,
"fetchingFromTargetElapsed": 8749,
"evaluated": 1,
"elapsed": 8749.445,
"resultType": "collection",
"resultSize": 1,
"@fieldTypes": "documentReads=l,current=x,recordReads=l,optimizationElapsed=l,fetchingFromTargetElapsed=l,evaluated=l,elapsed=f"
}
],
"notification": "Query executed in 8.759 sec. Returned 1 record(s)"
}
これを行うより速い方法はありますか?
チャットの使用例を参照しないでください...
私はorientdb 2.2.7を使用しています