Sqlite查询优化(选择*来自AND的位置,而不是按限制偏移的顺序)

时间:2010-02-16 21:07:21

标签: sqlite

使用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 IfZero 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 CommentActivity 0

14转到0 74 0 0

15 OpenRead 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 Null 0 9 0 0

21 MakeRecord 4 1 9 a 0

22 IdxInsert 4 9 0 0

23 MakeRecord 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 SeekGe 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 MakeRecord 10 7 9 0

41栏0 6 17 0

42序列1 18 0 0

43移动9 19 1 0

44 MakeRecord 17 3 8 0

45 IdxInsert 1 8 0 0

46 IfZero 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 OpenPseudo 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 ResultRow 10 7 0 0

71下一页1 57 0 0

72关闭5 0 0 0

73 Halt 0 0 0 0

74交易0 0 0 0

75 VerifyCookie 0 5 0 0

76 TableLock 0 2 0 FriendFeed 0

77转到0 15 0 0

3 个答案:

答案 0 :(得分:1)

  • 在您的选择
  • 中添加列
  • 规范化更多表格。例如,您可以在具有数字主键的其他表中定义ActivityTypeUserKey
  • 因为你有100到1次读写操作,所以在select之前发出SHARED锁(如果必须,写进程可以再等一会儿)

答案 1 :(得分:0)

我会移除select * from并将其更改为select [column1], [column2] from

这样做的原因是你只返回你需要的值(IE:我看你的表有6列,但你的结果只返回5列。),它减少了开销,因为你不使用一张通配符。

答案 2 :(得分:0)

也许OR会比IN更快?


修改 检查一下:http://www.sqlite.org/optoverview.html#or_opt