互联网书签的(简化)数据库。我认为按逻辑方式组织表是有意义的,如下:
Bookmarks (id, title, url; basically external data)
+------+------------+-----+
| suid | Title | ... |
+------+------------+-----+
User (user-specific data: favorites, ratings, etc)
+------+------------+-----+
| suid | IsFavorite | ... |
+ + (0 or 1) + +
+------+------------+-----+
History (last used, use count etc)
+------+------------+-----+
| suid | LastUsed | ... |
+ +(TDateTime) + +
+------+------------+-----+
('suid'是唯一ID,整数主键)
从标记为收藏的书签中,我需要选择N 最近使用的(为方便起见,在运行时填充菜单)。
SELECT Bookmarks.suid, Title from Bookmarks
INNER JOIN User USING (suid)
INNER JOIN History USING (suid)
WHERE IsFavorite = 1
ORDER BY LastUsed DESC
LIMIT 15;
该陈述有效,并且看起来足够可读,但它是否是最佳的? Bookmarks表旨在平均保存20-50k记录(即,不是您的标准浏览器书签管理器:-)该应用程序将在启动时执行3或4个类似的语句来填充控件。示例中使用的所有字段都已编制索引。
我正在自学SQL并提出上面的代码,但也许我忽略了可以改进它的语法或成语?
答案 0 :(得分:6)
从原始SQL中确切地猜测数据库引擎将如何满足查询是不可能的(或者至少非常非常困难)。因此,您需要使用EXPLAIN来了解SQLite将如何实际获取数据。请注意,它生成的执行计划会有所不同,具体取决于每个表中的数据量以及数据的“外观”(根据索引列中的不同值的数量)。因此,请确保使用真实的数据填充测试数据库。
一旦你尝试了EXPLAIN,我认为你可能会发现SQLite在参加前15场比赛之前一起加入了桌面,如果是真的话,这将是非最佳的。如果情况确实如此,您可以尝试类似:
SELECT Bookmarks.suid, Title from Bookmarks
INNER JOIN User USING (suid)
WHERE IsFavorite = 1
AND suid IN (SELECT suid FROM History ORDER BY LastUsed DESC LIMIT 15);
但是,再一次,在从EXPLAIN看到SQLite以非最佳方式获取数据之前,请不要尝试。
答案 1 :(得分:0)
对我来说没问题。您可能已经知道这一点,但如果您想进一步调整它,可以使用explain关键字(http://www.sqlite.org/lang_explain.html)调查您的查询。
干杯!
答案 2 :(得分:0)
您可以使用关键字EXPLAIN,如前所述,但还有其他一些方法可以改进它。 有一个网站上有一些信息...请点击'here点击查看更多信息...... 祝你好运!