是什么决定了sqlite join中的搜索顺序?

时间:2017-07-02 10:09:37

标签: sql sqlite

我有两张桌子:

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

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

我试图看看作者是否存在于最喜欢的书中。

以下声明有效,但如果favoriteBooks的行数较少,则速度很慢,如果数量很大,则速度很快。我认为这是因为我正在搜索书中的每一行并查看它是否在最喜欢的书中,而不是通过每个喜欢的书并检查作者。

我该如何解决这个问题?

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

谢谢!

1 个答案:

答案 0 :(得分: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);

请注意,基本上有两种方法来处理这些数据。浏览具有指定作者的所有书籍,然后查看哪些是最喜欢的书籍。或者,浏览所有喜爱的书籍,看看哪个有指定的作者。

你的问题表明,最喜欢的书籍数量可以随意增长,所以第一种方法更好。

另外,请注意,一本书可以有多位作者,但您的问题似乎没有考虑到这一点。