【问题标题】:How to index a View from joins and subsequent queries from the view?如何从视图的连接和后续查询中索引视图?
【发布时间】:2019-10-07 12:22:39
【问题描述】:

我是 sql 索引的新手,想要索引它

CREATE TABLE IF NOT EXISTS message (
    id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    remoteId TEXT,
    text TEXT,
    timestamp INTEGER NOT NULL DEFAULT 0,
    channelId TEXT NOT NULL,
    accountId TEXT NOT NULL,

    username TEXT NOT NULL,
    editUsername TEXT,
    wm_createdUsername TEXT,
    wm_organizedUsername TEXT,
    rc_username TEXT,
    p_messageRemoteId TEXT,
    c_messageRemoteId TEXT,
    ....

    UNIQUE (remoteId, accountId),
    FOREIGN KEY (channelId, accountId) REFERENCES channel(id, accountId) ON DELETE CASCADE,
    FOREIGN KEY (p_messageRemoteId, accountId) REFERENCES message(remoteId, accountId) ON DELETE CASCADE,
    FOREIGN KEY (c_messageRemoteId, accountId) REFERENCES message(remoteId, accountId) ON DELETE CASCADE
);

CREATE VIEW messageAndUser AS
SELECT ...
FROM message
LEFT JOIN user AS u ON message.username = u.name AND message.accountId = u.accountId
LEFT JOIN user AS e ON message.editUsername = e.name AND message.accountId = e.accountId
LEFT JOIN user AS wm ON message.wm_organizedUsername = wm.name AND message.accountId = wm.accountId
LEFT JOIN user AS rc ON message.rc_username = rc.name AND message.accountId = rc.accountId
LEFT JOIN user AS i ON message.i_username = i.name AND message.accountId = i.accountId;

频道消息:

SELECT *
FROM messageAndUser
WHERE channelId=? AND accountId=?
ORDER BY timestamp DESC

;

我的直觉告诉我,索引需要放在AND语句的所有部分作为一个单元。

但是我不知道该怎么做是,如果我有一个涵盖视图中连接的所有部分的索引,现在如果来自该视图的查询,即select from view where foo=?,我是否需要创建新的索引包含视图 + foo 的索引中的所有列?或者有没有办法组成这个?

【问题讨论】:

  • 作为第一个猜测,user(accountId, name) 上的索引在这些连接中将非常有用。学习如何阅读EXPLAIN QUERY PLAN 输出将有助于识别可能的索引,sqlite3 shell 的.expert 命令非常方便(输入它,然后下一次查询运行将给出索引建议)。
  • use-the-index-luke.com 也很有帮助。

标签: sql sqlite indexing view sql-view


【解决方案1】:

视图不能直接被索引,但可以从视图查询中涉及的表上的索引中受益。

查看您的架构和视图似乎您错过了连接的主索引

table  message  column   accountId

做到唯一索引UNIQUE(remoteId,accountId在右侧显示accountId..这对于视图中使用的连接没有用处..

【讨论】:

  • 呃,对不起,我没有关注。你是说我应该创建以 accoungId 开头的索引吗?
  • 如果您的 remoteId 不如 accountId 重要 .. 是 .. 如果您需要索引 remoteId,accountId 出于其他原因,您应该只为 accountId 添加一个新索引(至少)
  • 多用户加入怎么办?
  • 表总是相同的,并且为每个表别名评估相关索引..在这种情况下,索引是相同的,但应该应用于几个不同的表别名..(你可以尝试用一个小视图和评估这个expalin计划)
  • 这是另一个方面(为此,您应该为每个列提供正确的索引)主要方面是每个连接中都存在非最佳索引。一旦解决了这个问题,问题就是仅与(重复的)单连接相关..为此,您应该考虑对索引进行适当的设置(如果您希望视图结果可用性的快速性能)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-31
  • 1970-01-01
  • 2012-04-20
  • 2017-05-19
  • 1970-01-01
相关资源
最近更新 更多