2017-07-02 74 views
0

我有兩個表:什麼決定了sqlite連接中的搜索順序?

books: 
id INTEGER PRIMARY KEY, 
author TEXT, 
title TEXT 

favoriteBooks: 
id INTEGER PRIMARY KEY, 
FOREIGN KEY(id) REFERENCES books(id) 

我想看看是否在喜歡的圖書存在的作者。

以下表述適用,但如果favoriteBooks的行數較少,則速度較慢,如果數量較多,則速度較快。我認爲它是因爲我正在搜索書籍中的每一行,並查看它是否位於favoriteBooks中,而不是檢查每個FavoriteBook並檢查作者。

我該如何解決這個問題?

SELECT EXISTS (
SELECT 1 FROM books b 
INNER JOIN favoriteBooks f ON b.id = f.id 
AND author="Some Author" LIMIT 1); 

謝謝!

+1

您聽說過索引嗎? –

+0

我在書中有一個id索引。我需要以某種方式將它鏈接到favoriteBooks嗎? – phimath

+1

添加索引'創建索引somename ON書(作者)'還有'創建索引somename2 ON favoriteBooks(ID)' – krokodilko

回答

0

這個查詢:

SELECT EXISTS (SELECT 1 
       FROM books b INNER JOIN 
        favoriteBooks f 
        ON b.id = f.id AND author = 'Some Author' 
       LIMIT 1 
      ); 

是寫邏輯的一種方式。請注意,LIMIT是不必要的。 EXISTS負責照顧。

你想在books(author, id)指數:

CREATE INDEX idx_books_author_id ON books(author, id); 

注意,基本上有處理這個數據的方式。瀏覽所有具有指定作者的書籍,然後查看哪些書籍是最喜歡的書籍。或者,瀏覽所有最喜歡的書籍,看看哪些書籍有指定的作者。

你的問題表明,最喜歡的書的數量可以增長到任意大,所以第一種方法更好。

此外,請注意,一本書可以有多個作者,但您的問題似乎沒有考慮到這一點。

+0

_注意基本上有兩種方法來處理這些數據。瀏覽所有具有指定作者的書籍,然後查看哪些書籍是最喜歡的。或者,瀏覽所有最喜愛的書籍,看看哪些書有指定的作者._你如何改變這些書的完成?你的選擇聲明與我的有什麼不同? – phimath

+0

@phimath。 。 。 'SELECT'語句是你的語句,格式化以便我可以讀取它。您無法真正控制優化器如何創建執行計劃。您可以爲其提供選擇最佳計劃的工具 - 這些工具包括具有適當的索引。 –