【发布时间】:2015-01-01 09:02:18
【问题描述】:
我正在开展一个抓取项目,以在不同的计划中抓取项目及其查看次数。计划是脚本打算运行的用户定义的时间段(日期)。
表结构如下:
CREATE TABLE IF NOT EXISTS `stats` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`schedule_id` smallint(11) NOT NULL,
`type` smallint(11) NOT NULL,
`name` varchar(250) COLLATE utf8_unicode_ci NOT NULL,
`views` int(11) NOT NULL,
`updated_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ;
所有数据都存储在表 stats 中,稍后将对其进行分析以查看视图中的类型增长。
数据会是这样的:
样本集
抓取是分时段完成的,对于每个计划,预计会有大约 20K 条目。计划可以每天或每周进行,因此数据将在 5-6 年增长到大约 2-3 百万个月。
在这些数据上,我需要执行查询以汇总选定范围内的相同名称。
例如:
我需要汇总多个日程表中的相同项目(名称)。如果选择了时间表 1 和 2,则只会选择同时属于这两个时间表的项目。所以这里将是 ItemA 和 ItemB。
应在此处计算按类型计算的视图总和。
因此对于时间表 1:(已更新)
SELECT COUNT(t.`type`) AS count, SUM(t.views) AS view_count
FROM `stats` t
INNER JOIN
(
SELECT name,COUNT(name) as c FROM `stats` WHERE `schedule_id` IN (1,2) GROUP BY name HAVING c=2
) t2 ON t2.`name` = t.`name`
WHERE `schedule_id`=2 GROUP BY type
这是我的预期结果。
但是我读过使用子查询,在哪里,varchar 比较字段无助于优化查询。如何优化这以获得更好的性能。
Same Type Aggregator 的规则如下:
1.在一个schedule id下,可以有同名不同类型值。schedule_id、name和type的组合不会重复。
2.Type wise aggregator - 对每种类型下的值进行求和。
我正在 Python 中进行项目 - MySQL 用于抓取目的,PHP 用于列出结果。我想知道如何正确组织此表以及查询以获得更好的性能。 请指教。
【问题讨论】:
-
对于初学者,我会创建一个包含 id 和相应名称的字典表,例如
itemA,并且只将 id 存储在主表中。这肯定会加快查询速度,如果您想检索名称,您可以随时通过 id 加入 dict 表。 -
@ConsiderMe 像 ItemA 这样的名称只是一个虚拟值。在实际情况下,将其放入字典表并不是一种平滑的方法。如果 varchar 产生问题,是否建议将 varchar 名称字符串转换为整数。
-
与性能无关,但您的子查询正在尝试查找 schedule_id 为 1 和 2 的记录。但是它也会匹配任何 schedule_id 为 1 的记录两次。如果这在逻辑上不可能发生,那么您可以轻松地在没有子查询的情况下重写它。
标签: mysql sql subquery query-optimization