我看到的唯一性能文章是the one produced by @Scott(the other answer to this question 的作者)。不幸的是,他的文章没有做到 Web SQL 数据库公正,因为它使用低效的 HAVING 子句来限制结果集的大小。我调整了 Scott 的 SQL,将 HAVING、GROUP BY 和 LEFT JOIN 替换为(几乎)等效的 WHERE 和子选择:
SELECT p.Name AS ProgramName,
s.rowid,
s.Name,
s.NowShowing,
s.ProgramID,
(SELECT COUNT(*) FROM Episode WHERE SeriesID = s.rowid AND STATUS IN ('Watched', 'Recorded', 'Expected') OR STATUS IS NULL) AS EpisodeCount,
(SELECT COUNT(*) FROM Episode WHERE SeriesID = s.rowid AND STATUS = 'Watched') AS WatchedCount,
(SELECT COUNT(*) FROM Episode WHERE SeriesID = s.rowid AND STATUS = 'Recorded') AS RecordedCount,
(SELECT COUNT(*) FROM Episode WHERE SeriesID = s.rowid AND STATUS = 'Expected') AS ExpectedCount
FROM Program p
JOIN Series s ON p.rowid = s.ProgramID
WHERE s.NowShowing IS NOT NULL OR
EXISTS (SELECT * FROM Episode WHERE SeriesID = s.rowid AND STATUS IN ('Recorded', 'Expected'))
ORDER BY CASE
WHEN s.NowShowing IS NULL THEN 1
ELSE 0
END,
s.NowShowing,
p.Name
这比原来的速度快了大约 28 倍——在我的计算机上是 20 毫秒对 560 毫秒——根据 Scott 的数字推断,它比等效的 IndexedDB 快了大约 10 倍。我无法确认这一点,因为 IndexedDB 代码在我的浏览器中不起作用,似乎是由于 API 更改。
我应该解释一下我上面写的“(几乎)”。 Scott 的原始 SQL 和我的 SQL 有微妙的不同含义:我的 EpisodeCount 上的一个免费的 WHERE 子句——它具有用索引搜索替换表扫描的效果——如果它不涵盖所有可能的 Status 值,则可能无法计算某些情节。删除此子句以将执行时间加倍至 40 毫秒为代价消除差异。
请注意,之前,我discussed with Scott 对他的 SQL 进行了较小的更改,也达到了 40 毫秒的时间。
更新:非常感谢 Scott 更新他的article 以感谢我们进行的讨论。