簡體   English   中英

用於內部聯接關鍵字搜索的SQL數據庫索引設計

[英]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';

這樣速度更快,但是感覺不對,因為如果我有很多關鍵字,它將變得很丑陋。

該查詢所需的關鍵索引

  • 關鍵字(關鍵字)
  • entries_keywords(keyword_id,entry_id)
  • 項(ID)

您必須使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM