- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在配备 4GB 内存的 Macbook Pro 2.53ghz 上运行以下查询:
SELECT
c.id AS id,
c.name AS name,
c.parent_id AS parent_id,
s.domain AS domain_name,
s.domain_id AS domain_id,
NULL AS stats
FROM
stats s
LEFT JOIN stats_id_category sic ON s.id = sic.stats_id
LEFT JOIN categories c ON c.id = sic.category_id
GROUP BY
c.name
完成大约需要 17 秒。
解释:
alt text http://img7.imageshack.us/img7/1364/picture1va.png
表格:
信息:
Number of rows: 147397
Data size: 20.3MB
Index size: 1.4MB
表:
CREATE TABLE `stats` (
`id` int(11) unsigned NOT NULL auto_increment,
`time` int(11) NOT NULL,
`domain` varchar(40) NOT NULL,
`ip` varchar(20) NOT NULL,
`user_agent` varchar(255) NOT NULL,
`domain_id` int(11) NOT NULL,
`date` timestamp NOT NULL default CURRENT_TIMESTAMP,
`referrer` varchar(400) default NULL,
KEY `id` (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=147398 DEFAULT CHARSET=utf8
信息二表:
Number of rows: 1285093
Data size: 11MB
Index size: 17.5MB
第二张表:
CREATE TABLE `stats_id_category` (
`stats_id` int(11) NOT NULL,
`category_id` int(11) NOT NULL,
KEY `stats_id` (`stats_id`,`category_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
信息第三表:
Number of rows: 161
Data size: 3.9KB
Index size: 8KB
第三张表:
CREATE TABLE `categories` (
`id` int(11) NOT NULL auto_increment,
`parent_id` int(11) default NULL,
`name` varchar(40) NOT NULL,
`questions_category_id` int(11) NOT NULL default '0',
`rank` int(2) NOT NULL default '0',
PRIMARY KEY (`id`),
KEY `id` (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=205 DEFAULT CHARSET=latin1
希望有人能帮助我加快速度。
最佳答案
我在您的查询中看到几个 WTF:
您使用了两个 LEFT OUTER JOIN
,但随后您按可能没有匹配项的 c.name
列分组。所以也许你真的不需要外部连接?如果是这种情况,您应该使用内部联接,因为外部联接通常速度较慢。
您正在按 c.name
分组,但这会为您的选择列表中的所有其他列提供不明确的结果。 IE。在按 c.name
分组的每个分组中,这些列中可能有多个值。您很幸运您使用的是 MySQL,因为此查询只会在任何其他 RDBMS 中产生错误。
这是一个性能问题,因为 GROUP BY
可能导致您在 EXPLAIN 中看到的“using temporary; using filesort
”。这是一个臭名昭著的性能 killer ,它可能是此查询花费 17 秒的最大原因。由于不清楚您为什么要使用 GROUP BY
(不使用聚合函数,并且违反了单值规则),看来您需要重新考虑这一点。
您正在按 c.name
分组,它没有 UNIQUE
约束。理论上您可以有多个名称相同的类别,这些类别将集中在一个组中。我想知道如果您希望每个类别一个组,为什么不按 c.id
分组。
SELECT NULL AS stats
:我不明白您为什么需要这个。这有点像创建一个您从未使用过的变量。它不应该损害性能,但它只是另一个 WTF 让我觉得你没有很好地考虑这个查询。
您在评论中说您要查找每个类别的访问者数量。但是您的查询没有任何聚合函数,例如 SUM()
或 COUNT()
。您的选择列表包括 s.domain
和 s.domain_id
,每个访问者都不同,对吧?那么,如果每个类别只有一行,您期望结果集中的值是多少?这也不是真正的性能问题,它只是意味着您的查询结果没有告诉您任何有用的信息。
您的 stats_id_category
表在其两列上有一个索引,但没有主键。因此您很容易得到重复的行,这意味着您的访问者数量可能不准确。您需要删除该冗余索引并改用主键。我会在该主键中首先订购 category_id
,以便连接可以利用索引。
ALTER TABLE stats_id_category DROP KEY stats_id,
ADD PRIMARY KEY (category_id, stats_id);
现在,如果您需要计算的只是访问者数量,您可以删除一个连接:
SELECT c.id, c.name, c.parent_id, COUNT(*) AS num_visitors
FROM categories c
INNER JOIN stats_id_category sic ON (sic.category_id = c.id)
GROUP BY c.id;
现在查询根本不需要读取stats
表,甚至不需要读取stats_id_category 表
。它可以通过读取 stats_id_category
表的索引来简单地获取它的计数,这应该会减少很多工作。
关于mysql - 优化 MySQL 查询,耗时将近 20 秒!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1382549/
我在我的 UIPath 项目中实现了一个普通的“for each”循环(不是每行特定的 excel)。 for-each 循环使用以前从 excel 文件中检索到的数据查看数据表。 然后,for-ea
我认为我的 SQL 查询花费的时间太长,现在看起来大约需要 30 秒。我有两个表,Record 和 Mainrecord。我想获取有关列金额中包含 0 的所有 Mainrecords 的信息,并且在这
这个编辑器是水平的http://tinymce.moxiecode.com/examples/simple.php我似乎只找到水平编辑器,有人遇到过垂直编辑器吗?有什么例子吗? build 需要多长时
我想创建一个跟踪任务时间的 ASP.NET WinForms 应用程序。我需要能够编写表单,以便将任务添加到数据库、在新选项卡中打开它,以及能够开始、暂停和停止任务。完成后,我需要计算完成任务所需的时
抱歉,我是 C 的新手。但我做错了什么?几乎尝试了一切,但仍然无法计算执行 t1 和 t2 之间的代码所传递的秒数,总是返回我在 0.00 秒内完成。感谢您的耐心等待:) #include cloc
我有 2 个简单的函数(在一个范围内循环)可以单独运行而没有任何依赖性。我正在尝试使用 Python 多处理模块和多线程模块来运行这 2 个函数。 当我比较输出时,我看到多进程应用程序比多线程模块多花
尝试记录使用装饰器运行函数所需的时间,但我误解了一些东西。它拒绝写登录装饰器。 当你颠倒装饰器的顺序时,它会导致模板上的构建错误(就像信息丢失一样)。 在我的初始 py 中: if app.debug
我听说 System.out.println(); Java 语句是昂贵的(它消耗了很多时间) 所以我试着评估一下它的成本: 当我评估 5 个语句时...成本 = 1.0 所以我预计 1 条语句的成本
我正在使用 codeigniter REST-API(作者:philsturgeon 引用 URL: https://github.com/philsturgeon/codeigniter-rests
我在 SFML 中有一个时钟和计时器,它测量秒数。我试图在经过一定秒数(特别是 4 秒)后执行下一个操作 这是我的代码 #include "stdafx.h" #include "Splash
例如,我们在 SomeActivity 中,该 Activity 有一个按钮,用于调用将文件从一个目录移动到另一个目录(我们称之为作业)。 在黑莓手机上我会: 推送一个不可取消的弹出窗口(对话框屏幕)
我正在尝试从大小为 7,140,000 的 ArrayList 中删除 140,000 个对象。我预计这会花费几秒钟(如果那样的话),但 Java 每千个对象花费几秒钟。这是我的代码:
我得到了这个查询,它占用了我的 elapsed_time 并且工作正常,但后来我意识到我得到的 actual_elapsed 的值是错误的。 actual_elapsed 是我使用 TIMEDIFF(
我在更新面板中放置了一个 GridView。 当用户按下按钮时,gridView 将被一个数据表填满: GridView_Overview.Da
客户想要将数据库从 MS SQL 转换为 MySql。 就我个人而言,我不会这样做,我更喜欢使用 MS SQL 来处理大型数据库,并且喜欢使用 MSSQL 时可用的工具。 但是我确实在较小的项目上使用
我目前正在为一个 Julia 项目使用 Graph Database,使用 Redis。 有时 Redis 请求需要 300 毫秒才能执行,我不明白为什么。我运行了一个简单的请求 10.000 次(请
我们在一次运行中处理了 500 万个请求。然而,在运行期间,很少有请求失败。验证关闭后,我们了解到 Full GC 已启动,并且花费了超过 40 秒(到 60 秒),从而导致超时。 配置:我们有 3
我是一名优秀的程序员,十分优秀!