[英]'IN' and 'INNER JOIN' keyword not working with database
[英]SQL database index design for inner join keyword search
我有這個查詢
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';
這樣速度更快,但是感覺不對,因為如果我有很多關鍵字,它將變得很丑陋。
該查詢所需的關鍵索引
您必須使用MySQL,因為否則SELECT a。*將會失敗。
關於該語句的第二條評論之后的編輯 ,請讓我指出為什么 select a.*
將在此處失敗-這是由於GROUP BY
。
解釋一下,因為條件(WHERE)在c.key上,所以需要對其進行索引。
然后,這對b.keyword_id進行JOIN。 我們創建一個包含b.entry_id的索引,這樣它就不必查找表了-僅索引就可以覆蓋所需的列。
最后,a.id = b.entry_id重新加入到entrys表中,因此我們對該表的ID進行了索引。
很有可能entries_keywords
entries(id)
已經是主鍵,但是您可能已經以其他方式為 entries_keywords
編制了索引-不能滿足此連接要求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.