- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
嗨,我写了一个有效的查询:
SELECT `comments`.* FROM `comments`
RIGHT JOIN (SELECT MAX( id ) AS id, core_id, topic_id
FROM comments GROUP BY core_id, topic_id order by id desc) comm
ON comm.id = comments.id LIMIT 10
最佳答案
方法1-改进原始查询
我确信,在这种情况下,INNER JOIN
就足够了,没有理由做< cc>(如果RIGHT JOIN
存在于id
,它也将存在于comm
)。comments
s可导致better performance。
此外,您真的希望将INNER JOIN
推入LIMIT 10
(顺便说一下,将它与comm
放在一起):
首先,不把ORDER BY
和LIMIT 10
放在一起,就不会得到最近发布到主题中的10个主题(子查询的顺序不一定会保留到您要保存的最终结果中)
此外,在最里面的聚合子查询中执行ORDER BY
将鼓励基于成本的优化器支持nested loops(确切地说,是10个)而不是hash或merge joins(对于任何大小适当的comm
表,10个嵌套循环是最快的)
因此,您的查询应重写为:
SELECT `comments`.* FROM `comments`
INNER JOIN (
SELECT MAX( id ) AS id, core_id, topic_id
FROM comments
GROUP BY core_id, topic_id
ORDER BY id DESC
LIMIT 10
) comm
ON comm.id = comments.id
ORDER BY comments.id
LIMIT
查看查询正在执行的操作。不要忘记检查是否已在
LIMIT
上创建了索引,以帮助处理
comments
嵌套循环。
EXPLAIN
,那么它可能仍然是一个重要的瓶颈。这实际上取决于数据库在一起看到
comments.id
、
JOIN
和
comm
时的智能程度。
comments
表示子查询正在执行表扫描,那么您可以尝试将SQL和应用程序级逻辑结合起来以获得最佳性能,前提是我正确理解了您的需求,并且您希望标识在十个不同主题中发布的十条最新注释:
# pseudo-code
core_topics_map = { }
command = "SELECT * FROM comments ORDER BY id DESC;"
command.execute
# iterate over the result set, betting that we will be able to break
# early, bringing only a handful of rows over from the database server
while command.fetch_next_row do
# have we identified our 10 most recent topics?
if core_topics_map.size >= 10 then
command.close
break
else
core_topic_key = pair(command.field('core_id'), command.field('topic_id'))
if not defined?(core_topics_map[core_topic_key]) then
core_topics_map[core_topic_key] = command.field('id')
end
end
done
# sort our 10 topics in reverse chronological order
sort_by_values core_topics_map
GROUP BY
返回控制之前没有尝试将所有行缓冲到内存中),上面的操作将只获取少量行,始终使用索引,而不涉及表扫描。
ORDER BY
:
SELECT `comments`.* FROM `comments`
INNER JOIN (
SELECT MAX( id ) AS id, core_id, topic_id
FROM comments
WHERE id >= :last_lowest_id
GROUP BY core_id, topic_id
ORDER BY id DESC
LIMIT 10
) comm
ON comm.id = comments.id
ORDER BY comments.id
LIMIT
表示
EXPLAIN
。查询将按降序返回最多10行。在应用程序中,将最后一行的
execute
放在一边,下次运行查询时将其值重用为
WHERE id >= :last_lowest_id
,然后重复(再次,将最近一次查询返回的最后一行的
0
放在一边等),这将基本上使查询递增,并且非常快。
:last_lowest_id
设置为
id
的情况下首次运行查询
:last_lowest_id
id
:last_lowest_id
设置为
0
的情况下第二次运行查询
129, 100, 99, 88, 83, 79, 78, 75, 73, 70
70
:last_lowest_id
表中执行
70
的次数比
130, 129, 100, 99, 88, 83, 79, 78, 75, 73
表中执行
73
的次数多得多,请考虑在
SELECT ... ORDER BY id DESC LIMIT 10
表中投入更多的工作以使
INSERT
更快。因此,您可以在
comments
etc.表中添加一个索引的
INSERT
列,每当您
SELECT
表中有注释时,也可以考虑将相应主题的
updated_at
值更新为
topics
。然后,您可以很容易地选择最近更新的10个主题(返回10行的一个简单而简短的索引扫描),使用
INSERT
表进行内部连接以获取这10个主题的
comments
(在选择最大的10个主题之前(如在原始和方法1中)比为所有主题获取
updated_at
的效率要高很多),然后再次在
NOW()
获取这10个列的其余值。
updated_at
),或者如果可以删除主题或评论(无需更改即可支持主题删除;若要正确支持评论删除,则应使用最新未删除评论的
comments
值在评论
MAX(id)
和
MAX(id)
上更新主题的
comments
,则必须使用方法4主题)
关于sql - 使用GROUP BY执行SELECT的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2527440/
我想编写一个 linq 表达式,该表达式将返回不包含特定值的 ID。例如,我想返回所有不具有 Value = 30 的不同 ID。 ID, Value 1, 10 1, 20 1, 30 2,
我正在尝试使用 Regexp 匹配 Nmap 命令的输出。可以有两种不同的格式。 第一种格式(当 nmap 可以找到主机名时) Nmap scan report for 2u4n32t-n4 (192
我正在 Visual Studio 2012 上使用 C# 开发一个软件。我使用 MySQL Connector 6.9.1 进行 MySQL 连接。我的软件在我的操作系统(Win8 x64)上运行顺
在 Django 中(使用 django.contrib.auth 时)我可以添加一个 Group到另一个 Group ?即一个Group成为另一个成员(member) Group ? 如果是这样,我
我试图通过使用动态组参数对数据进行分组来循环。 我们可以在循环的 WHERE 条件上使用动态查询,但我不知道是否可以在组条件中使用动态字符串。 以下是用户决定按哪个字段分组,然后根据决定放置其他逻辑的
我有这样的字符串 s = 'MR1|L2-S1x' 模式总是相同的:一个或两个字符,在 [|.+:x-] 中可选地后跟一个数字和一个分隔符。此模式可以重复 6 次。 所以匹配模式很明确。 p = r'
我有一个带有时间戳字段“bar”的表“foo”。如何仅获取查询的最旧时间戳,例如: SELECT foo.bar from foo?我尝试执行以下操作: SELECT MIN(foo.bar) fro
在我的 Django 项目中,我有一个 user_manage 应用程序。 我在 user_manage 应用的 model.py 中创建了一个名为 UserManage 的模型: from djan
所以我有这样的输入: 还有一个模板指令,例如: 看来我只获得了 foo 和 bar 的组。 (为什么?我预计我可能会得到第三组 current-group-key() = '')。
我正在尝试扩展 django.contrib.auth 并遇到将用户添加到组中的情况,这可以通过两种方式完成。我只是想知道为什么会这样,以及其中一种相对于另一种的优势是什么。 最佳答案 他们做完全相同
我使用的是旧的 PHP 脚本,并且此查询有错误。由于我没有使用 mysql 的经验,因此无法修复它。 "SELECT COUNT(p.postid) AS pid, p.*, t.* FROM ".T
我有几行 Objective-C 代码,例如: ABAddressBookRef addressBook; CFErrorRef error = NULL; addressBook = ABAddre
我正在使用 MariaDB IMDB 电影数据集,我试图解决以下问题。电影表包含 id、名称、排名和年份列 A decade is a sequence of 10 consecutive years
让我从数据开始,以便更好地描述我的需求。我有一个名为 SUPERMARKET 的表,其中包含以下字段: Field 1: StoreID Field 2: ProductCategory Field
你好我有这个查询: SELECT DISTINCT a.id, a.runcd, (SELECT SUM(b.CALVAL) FROM GRS b WHERE b.PCode=11000 AND a.
我想在 xquery 中使用 Group By。有人可以告诉我如何在 Marklogic 中使用 Group By 吗? 最佳答案 或者,您可以使用 xdmp:xslt-invoke 调用 XSLT或
因此,当通过 from sequelize 请求组时,如下所示: return models.WorkingCalendar .findAll({
我希望我解释正确。 我有 2 个表,有 第一个表(table1) +------------+------+-------+-------+ | Date | Item | Block |
我的表 MYTABLE 有 2 列:A 和 B 我有以下代码片段: SELECT MYTABLE.A FROM MYTABLE HAVING SUM(MYTABLE.B) > 100
我有一个简单的行分组查询,需要 0.0045 秒。 300.000 行 从表 GROUP BY cid 中选择 cid 当我添加 MAX() 进行查询时,需要 0.65 秒才能返回。 从表 GROUP
我是一名优秀的程序员,十分优秀!