Как индексировать представление из объединений и последующие запросы из представления? - PullRequest
0 голосов
/ 21 мая 2019

Я новичок в индексировании 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?Или есть способ составить это?

1 Ответ

0 голосов
/ 21 мая 2019

Представление не может быть проиндексировано напрямую, но может извлечь выгоду из индексов, присутствующих в таблицах, участвующих в запросе представления.

Глядя на свою схему и вид, кажется, вы пропустили основной индекс для объединения

table  message  column   accountId

делает тот факт, что уникальный индекс UNIQUE (remoteId, accountId представляет accountId справа). Это бесполезно для соединения, используемого в представлении ..

...