Я новичок в индексировании 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;
channelMessages:
SELECT *
FROM messageAndUser
WHERE channelId=? AND accountId=?
ORDER BY timestamp DESC
;
Моя интуиция подсказывает мне, что индекс должен бытьразмещены на всех частях операторов AND как единое целое.
Однако я не уверен, как это сделать, если у меня есть индекс, который охватывает все части соединений в представлении, теперь, если запрос изэто представление, то есть select from view where foo=?
, мне нужно создать новый индекс, связывающий все столбцы из индекса для представления + foo?Или есть способ составить это?