【发布时间】: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