我有這個疑問SQL數據庫索引設計內加入關鍵字搜索
SELECT a.*
FROM entries a
INNER JOIN entries_keywords b ON a.id = b.entry_id
INNER JOIN keywords c ON b.keyword_id = c.id
WHERE c.key IN ('wake', 'up')
GROUP BY a.id
HAVING COUNT(*) = 2
,但它的速度慢。我如何優化設計索引以加快速度?
編輯 這是當前模式
CREATE TABLE `entries` (`id` integer PRIMARY KEY AUTOINCREMENT, `sha` text);
CREATE TABLE `entries_keywords` (`id` integer PRIMARY KEY AUTOINCREMENT, `entry_id` integer REFERENCES `entries`, `keyword_id` integer REFERENCES `keywords`);
CREATE TABLE `keywords` (`id` integer PRIMARY KEY AUTOINCREMENT, `key` string);
CREATE INDEX `entries_keywords_entry_id_index` ON `entries_keywords` (`entry_id`);
CREATE INDEX `entries_keywords_entry_id_keyword_id_index` ON `entries_keywords` (`entry_id`, `keyword_id`);
CREATE INDEX `entries_keywords_keyword_id_index` ON `entries_keywords` (`keyword_id`);
CREATE INDEX `keywords_key_index` ON `keywords` (`key`);
我使用SQLITE3,查詢不會失敗,但速度很慢。
現在我這樣的查詢(子查詢爲每個關鍵字):
select *
from (
select *
from (entries) e
inner join entries_keywords ek on e.id = ek.entry_id
inner join keywords k on ek.keyword_id = k.id
where k.key = 'wake') e
inner join entries_keywords ek on e.id = ek.entry_id
inner join keywords k on ek.keyword_id = k.id
where k.key = 'up';
這是方式更快,但感覺不對,因爲它會變得醜陋,如果我有很多的關鍵字。
你現在有什麼指標? – Taryn
引用列上的索引將有所幫助。緩慢的部分可能是最後一點..計數*對於性能不是很好。我假設這是mysql,但如果它是另一個數據庫,你可以使用keywords.key的部分索引作爲優化。 –
'keywords.key'編入索引嗎? –