- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我使用 MySQL 为我的站点构建了一个自定义论坛。列表页面本质上是一个包含以下列的表格:主题、上次更新和# Replies。
数据库表有以下列:
id
name
body
date
topic_id
email
主题 的 topic_id 为“0”,回复 的 topic_id 是其父主题的。
SELECT SQL_CALC_FOUND_ROWS
t.id, t.name, MAX(COALESCE(r.date, t.date)) AS date, COUNT(r.id) AS replies
FROM
wp_pod_tbl_forum t
LEFT OUTER JOIN
wp_pod_tbl_forum r ON (r.topic_id = t.id)
WHERE
t.topic_id = 0
GROUP BY
t.id
ORDER BY
date DESC LIMIT 0,20;
此表中共有大约 2,100 个项目,查询通常需要高达 6 秒的时间。我在“topic_id”列中添加了一个 INDEX,但这并没有多大帮助。有什么方法可以在不进行重大重组的情况下加快此查询的速度吗?
编辑:还没有完全正常工作。我似乎无法让下面的示例正常工作。
最佳答案
SELECT id, name, last_reply, replies
FROM (
SELECT topic_id, MAX(date) AS last_reply, COUNT(*) AS replies
FROM wp_pod_tbl_forum
GROUP BY
topic_id
) r
JOIN wp_pod_tbl_forum t
ON t.topic_id = 0
AND t.id = r.topic_id
UNION ALL
SELECT id, name, date, 0
FROM wp_pod_tbl_forum t
WHERE NOT EXISTS
(
SELECT NULL
FROM wp_pod_tbl_forum r
WHERE r.topic_id = t.id
)
AND t.topic_id = 0
ORDER BY
date DESC
LIMIT 0, 20
如果你的表是MyISAM
或者id
不是PRIMARY KEY
,你需要在(topic_id , id)
.
如果你的表是 InnoDB
并且 id
是一个 PRIMARY KEY
,那么索引就在 (topic_id)
将执行(id
将隐式添加到索引中)。
更新
如果您在 (topic_id, id)
和 (date, id)
上有索引,这个查询很可能会更有效:
有关性能详细信息,请参阅我博客中的这篇文章:
此查询在 100,000
行示例数据上在 30 毫秒
内完成:
SELECT id, name, last_reply,
(
SELECT COUNT(*)
FROM wp_pod_tbl_forum fc
WHERE fc.topic_id = fl.topic_id
) AS replies
FROM (
SELECT topic_id, date AS last_reply
FROM wp_pod_tbl_forum fo
WHERE id = (
SELECT id
FROM wp_pod_tbl_forum fp
WHERE fp.topic_id = fo.topic_id
ORDER BY
fp.date DESC, fp.id DESC
LIMIT 1
)
AND fo.topic_id <> 0
ORDER BY
fo.date DESC, fo.id DESC
LIMIT 20
) fl
JOIN wp_pod_tbl_forum ft
ON ft.id = fl.topic_id
UNION ALL
SELECT id, name, date, 0
FROM wp_pod_tbl_forum t
WHERE NOT EXISTS
(
SELECT NULL
FROM wp_pod_tbl_forum r
WHERE r.topic_id = t.id
)
AND t.topic_id = 0
ORDER BY
last_reply DESC, id DESC
LIMIT 20
此查询需要两个索引才能有效。
如果您的表是 InnoDB
并且 id
是一个PRIMARY KEY
,那么您可以从上面的索引
。
关于sql - 优化 MySQL 查询以避免 "Using where; Using temporary; Using filesort",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1091974/
今天想测试一下PostgreSQL 9.1的一个新特性,就是unlogged table,结果报如下Error,谁能帮帮我? mydb=> CREATE UNLOGGED table testu (a
struct F { private: int* data; public: F( int n ) { data = new int; *dat
我创建了几个中间件类,现在想根据一些真实的 View 来测试它们。由于我的应用程序不包含任何 View 或 url conf 本身,我想知道是否有一种方法可以临时创建 View 和 url 配置,仅用
我正在使用 Spark,我想知道:如何通过对表 A 和 B 执行 sql 查询来创建名为 C 的临时表? sqlContext .read.json(file_name_A) .creat
我最近重新安装了 ubuntu 20.04.3,在做了一些设置后,我现在在运行 apt update 时总是收到以下错误.我一定是不小心删除了某种缓存文件或目录,但我不知道如何诊断或解决这个问题。 任
我的 Magento 版本是 2.2.3。我们使用的是第二代 Google Cloud SQL 实例。 运行索引命令时遇到错误 General error: 1787 Statement violat
此代码用于使用早期的 g++ 版本进行编译,例如5.3.使用 10.2 我得到以下结果(使用编译器选项 -std=c++11) tmp1.cpp: In function ΓÇÿint main(in
有没有办法不使用临时“结果”来编写以下代码? result = func(); if(result == -1) return func2(); else return res
我创建一个临时 NSManagedObject 并将其与主 NSManagedObjectContext 关联。我需要能够将其视为上下文中功能齐全的对象(执行获取请求等),因此无法在没有关联上下文的情
我一直在努力争取在 Azure 中实现角色内的同地缓存(非专用)。 在我的 MVC WebApi 2 项目的 web.config 中: ...
我写了一个类来使用它作为一个方便的 View ,例如基于范围的for s。总的来说,它只是一对带有边界检查的迭代器: template class Range { private: I begin
在运行我的代码(使用 gfortran 编译)时,我收到 Fortran 运行时警告“创建了临时数组”,我想知道是否有更好的方法来解决此警告。 我原来的代码是这样的: allocate(flx_est
经过长时间的研究,我正在写这篇文章,但我真的很难找到解决我问题的最佳方法。 我对 resKit 和 CoreData 都很陌生......无论如何,我正在映射并保存我从 Web 服务接收到的 JSON
我需要在java spring应用程序中实现像临时存储这样的东西。例如,当事件发生时,我放了一个值,但同时这个类正在被另一个监听器类监听,并且一旦需要的值到达此存储,监听器就会调用某些操作。在java
如果你查看MySql临时表的官方文档: http://dev.mysql.com/doc/refman/5.1/en/internal-temporary-tables.html 给出的理由是:
这个问题有点棘手。我正在使用将结果插入 DOM 的第三方库。 示例: $('#puthere').thirdpartyplugin(); 这将调用 thirdpartyplugin 并操作 HTML
这个查询非常简单,我想做的就是获取给定类别中按 last_updated 字段排序的所有文章: SELECT `articles`.* FROM `articles`, `ar
我已经制作了这个 C++ 代码: std::string const & Operand::toString() const { std::ostringstream convert
MySQL 文档说:“您不能在同一个查询中多次引用一个临时表。” 我知道之前有人问过这个问题。但我找不到针对以下内容的具体解决方案。 我正在对临时表进行预选 CREATE TEMPORARY TABL
我对使用 git 比较陌生。 最近我们从 master 分支了 +-10 个功能分支。我们称它们为 A、B、C 等。 我想将这些全部 merge 在一起进行测试。如果我创建一个新分支并 merge 我
我是一名优秀的程序员,十分优秀!