在SQLite中连接三个表的最佳方法
发布时间:2020-12-12 19:08:12 所属栏目:百科 来源:网络整理
导读:互联网书签的(简化)数据库.我认为以逻辑方式组织表是有意义的,如下所示: Bookmarks (id,title,url; basically external data)+------+------------+-----+| suid | Title | ... |+------+------------+-----+User (user-specific data: favorites,ratings,e
互联网书签的(简化)数据库.我认为以逻辑方式组织表是有意义的,如下所示:
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并提出上面的代码,但也许我忽略了可以改进它的语法或成语? 从原始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以非最佳方式获取数据之前,请不要尝试. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |