【发布时间】:2010-02-17 05:22:48
【问题描述】:
对于使用 Sqlite3 优化以下查询有什么想法吗?
SELECT * FROM Feed
WHERE ActivityType IN ('PhotoActivity','CommentActivity')
AND UserKey NOT IN ('testUser', 'testUser2')
ORDER BY TimeStamp DESC
LIMIT 20 OFFSET 0;
该表的记录永远不会超过 100,000 条,我们预计会进行 100 到 1 次读取和写入。
非常感谢任何帮助。
表Sql是:
CREATE TABLE Feed (
FeedActivityKey TEXT PRIMARY KEY,
UserKey TEXT,
AssemblyQualifiedName TEXT,
SerializedObject BLOB,
ActivityType TEXT,
CorrelatedKey TEXT,
TimeStamp INTEGER);
CREATE INDEX Feed_ActivityTypeUserKey ON [FriendFeed] (
[ActivityType], [UserKey] DESC);
CREATE INDEX Feed_UserKey ON [FriendFeed] (
[UserKey] DESC);
CREATE INDEX Feed_TimeStamp ON [FriendFeed] (
[TimeStamp] DESC);
解释输出是:
0 轨迹 0 0 0 0
1 OpenEphemeral 1 3 0 keyinfo(1,-BINARY) 0
2 整数 20 1 0 0
3 MustBeInt 1 0 0 0
4 如果零 1 73 0 0
5 整数 0 2 0 0
6 MustBeInt 2 0 0 0
7 IfPos 2 9 0 0
8 整数 0 2 0 0
9 加 1 2 3 0
10个IfPos 1 12 0 0
11 整数 -1 3 0 0
12 String8 0 4 0 PhotoActivity 0
13 String8 0 5 0 评论活动 0
14 转到 0 74 0 0
15 打开读取 0 2 0 7 0
16 OpenRead 2 4 0 keyinfo(2,BINARY,BINARY) 0
17 如果 7 25 0 0
18 整数 1 7 0 0
19 OpenEphemeral 4 1 0 keyinfo(1,BINARY) 0
20 空 0 9 0 0
21 制作记录 4 1 9 a 0
22 IdxInsert 4 9 0 0
23 制作记录 5 1 9 a 0
24 IdxInsert 4 9 0 0
25 倒带 4 53 0 0
26 列 4 0 6 0
27 IsNull 6 52 0 0
28 亲和力 6 1 0 aab 0
29 寻格 2 52 6 1 0
30 IdxGE 2 52 6 1 1
31 IdxRowid 2 9 0 0
32 寻找 0 9 0 0
33 列 0 0 10 0
34 列 2 1 11 0
35 列 0 2 12 0
36 列 0 3 13 0
37 列 2 0 14 0
38 列 0 5 15 0
39 列 0 6 16 0
40 制作记录 10 7 9 0
41 列 0 6 17 0
42 序列 1 18 0 0
43 移动 9 19 1 0
44 制作记录 17 3 8 0
45 IdxInsert 1 8 0 0
46 如果零 3 49 0 0
47 AddImm 3 -1 0 0
48 转到 0 51 0 0
49 最后 1 0 0 0
50 删除 1 0 0 0
51 下一个 2 30 0 0
52 下一个 4 26 0 0
53 关闭 0 0 0 0
54 关闭 2 0 0 0
55 开放伪 5 1 7 0
56 排序 1 72 0 0
57 AddImm 2 -1 0 0
58 IfNeg 2 60 0 0
59 转到 0 71 0 0
60 列 1 2 9 0
61 整数 1 8 0 0
62 插入 5 9 8 0
63 列 5 0 10 0
64 列 5 1 11 0
65 列 5 2 12 0
66 列 5 3 13 0
67 列 5 4 14 0
68 列 5 5 15 0
69 列 5 6 16 0
70 结果行 10 7 0 0
71 下一个 1 57 0 0
72 关闭 5 0 0 0
73 暂停 0 0 0 0
74 事务 0 0 0 0
75 验证Cookie 0 5 0 0
76 表锁 0 2 0 FriendFeed 0
77 转到 0 15 0 0
【问题讨论】:
-
我认为这只是一个错字,但您提供的 DDL 创建了一个名为 Feed 的表,但索引了一个名为 FriendFeed 的表。如果情况确实如此,那么您并没有为您选择的表编制索引。
-
(ActivityType)、(UserKey)、(ActivityType, UserKey)的基数是多少?它们是否受到可以存储整数 ID 的参考表的支持?
-
这些数据库将按用户存储在拥有大量用户的系统中。为这些存储参考表会导致大量重复数据。我可以为活动类型使用枚举,但在此数据集的上下文中,UserKey 可能是未知值。
-
运行分析后,我设法将查询缩短到 8 毫秒。
标签: sqlite