Sqlite 查询优化(select * from where in AND not in order by limit offset)

标签 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 必须是整数 1 0 0 0

4 如果零 1 73 0 0

5 整数 0 2 0 0

6 必须是整数 2 0 0 0

7 如果位置 2 9 0 0

8 整数 0 2 0 0

9 加 1 2 3 0

10 如果位置 1 12 0 0

11 整数 -1 3 0 0

12 字符串 8 0 4 0 照片事件 0

13 字符串 8 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 一个 0

22 IDx插入 4 9 0 0

23 制作记录 5 1 9 一个 0

24 标识插入 4 9 0 0

25 倒带 4 53 0 0

26 列 4 0 6 0

27 空值 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 IDx插入 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 加减量 2 -1 0 0

58 如果否定 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 friend 馈送 0

77 转到 0 15 0 0

最佳答案

  • 将列添加到您的选择
  • 规范化更多表格。例如,您可以定义 ActivityType , UserKey在具有数字主键的不同表中。
  • 由于您有 100 比 1 的读写次数,请发出 SHARED在选择之前锁定(如果必须,写入过程可以等待更长的时间)
  • 关于Sqlite 查询优化(select * from where in AND not in order by limit offset),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2276348/

    相关文章:

    sqlite - 如何在 sqlite 中列出数据库的所有触发器?

    android - 在 android 中限制 SQLite 查询

    sqlite - 为什么 SQLite 没有意识到这是一个覆盖索引?

    sqlite - SQLite 中的 SAVEPOINT 机制

    java - android sqlite 一次读取所有行

    c# - Xamarin PCL库和Sqlite数据存储

    sqlite - Beego raw sql - 类型转换问题

    android - 如何在 sqlite 中存储跨区字符串?

    python - AWS Lambda 函数无法连接到 S3 并查询 SQLite 数据库文件

    java - 使用 'where' 条件将值从一个表复制到另一个表