GROUP BY 对大型数据库没有限制
GROUP BY without limit on a large DB
我有 2 个表用于记录流量统计信息。第一个包含访问者信息,第二个包含访问过的页面。
然后我有这个查询,它应该让我得到一个按访问次数排序的浏览器列表。
SELECT tu.browser, COUNT(tp.id) AS count FROM t_users tu
LEFT JOIN t_pages tp ON tu.id = tp.id GROUP BY tu.browser
我想知道如果这些表中有数百万条记录,这个查询是否仍然有效。
请注意,我在查询中使用的所有列上都有索引。
要了解此查询是否对您的硬件上的数据运行得很快,您必须自己进行测量。
无论如何,这个查询已经很高效了。
可以使用 t_pages.id
上的索引完成连接,并且 GROUP BY 通过按顺序扫描 t_users.browser
上的索引条目非常有效。
然而,如果 t_users.id
不是 rowid
,即,如果它没有声明为 INTEGER PRIMARY KEY,那么从索引条目中查找它需要转到实际的 table;您可以通过添加包含 browser
和 id
字段的 covering index 来删除此步骤。
我有 2 个表用于记录流量统计信息。第一个包含访问者信息,第二个包含访问过的页面。
然后我有这个查询,它应该让我得到一个按访问次数排序的浏览器列表。
SELECT tu.browser, COUNT(tp.id) AS count FROM t_users tu
LEFT JOIN t_pages tp ON tu.id = tp.id GROUP BY tu.browser
我想知道如果这些表中有数百万条记录,这个查询是否仍然有效。
请注意,我在查询中使用的所有列上都有索引。
要了解此查询是否对您的硬件上的数据运行得很快,您必须自己进行测量。
无论如何,这个查询已经很高效了。
可以使用 t_pages.id
上的索引完成连接,并且 GROUP BY 通过按顺序扫描 t_users.browser
上的索引条目非常有效。
然而,如果 t_users.id
不是 rowid
,即,如果它没有声明为 INTEGER PRIMARY KEY,那么从索引条目中查找它需要转到实际的 table;您可以通过添加包含 browser
和 id
字段的 covering index 来删除此步骤。