【发布时间】:2017-01-24 13:09:13
【问题描述】:
我正在为一家媒体内容广播公司开发数据分析仪表板。即使用户点击某个频道,日志/记录也会存储到 MySQL DB 中。以下是存储有关频道播放时间的数据的表格。
这是表结构:
_____________________________________
| ID INT(11) |
_____________________________________
| Channel_ID INT(11) |
_____________________________________
| playing_date (DATE) |
_____________________________________
| country_code VARCHAR(50) |
_____________________________________
| playtime_in_sec INT(11) |
_____________________________________
| count_more_then_30_min_play INT(11) |
_____________________________________
| count_15_30_min_play INT(11) |
_____________________________________
| count_0_15_min_play |
_____________________________________
| channel_report_tag VARCHAR(50) |
_____________________________________
| device_report_tag VARCHAR(50) |
_____________________________________
| genre_report_tag VARCHAR(50) |
_____________________________________
我在一个仪表板图结构后面运行的查询是:
SELECT
channel_report_tag,
SUM(count_more_then_30_min_play) AS '>30 minutes',
SUM(count_15_30_min_play) AS '15-30 Minutes',
SUM(count_0_15_min_play) AS '0-15 Minutes'
FROM
channel_play_times_cleaned
WHERE
playing_date BETWEEN '' AND ''
AND country_code LIKE ''
AND device_report_tag LIKE ''
AND channel_report_tag LIKE ''
GROUP BY
channel_report_tag
LIMIT 10
这个查询基本上要花很多时间来返回结果集(假设表数据每天超过一百万条记录并且每秒都在增加)。我遇到了这个堆栈溢出问题:What generic techniques can be applied to optimize SQL queries?,它基本上提到了使用索引作为优化 SQL 查询的技术之一。目前我很困惑如何应用索引(即在哪些列上)以优化上述查询。如果有人可以根据我的具体情况提供创建索引的帮助,我将不胜感激。对于像我这样的初学者来说,任何其他专家意见当然都受到欢迎。
编辑:
正如@Thomas G 所建议的,
我已尝试改进我的查询并使其更具体:
SELECT
channel_report_tag,
SUM(count_more_then_30_min_play) AS '>30 minutes',
SUM(count_15_30_min_play) AS '15-30 Minutes',
SUM(count_0_15_min_play) AS '0-15 Minutes'
FROM
channel_play_times_cleaned
WHERE
playing_date BETWEEN '' AND ''
AND country_code = 'US'
AND device_report_tag = 'j8'
AND channel_report_tag = 'NAT GEO'
GROUP BY
channel_report_tag
LIMIT 10
【问题讨论】:
-
您必须对列进行索引,首先更改表结构,在“应用,还原”按钮之前,有一个选项卡部分,您必须在其中选择“索引”选项卡,在此选项卡中选择要索引的列,然后应用它
-
@chiragpatel “如何应用索引”,我知道。我要问的是在我提到的查询中应用哪些列。感谢任何方式的关注。
-
索引适用于处于 where 条件的列,如果该列数据类型为 Integer,则它执行得很快。
-
您可以为您的
like-code 添加示例值吗?如果您使用like '%xxx%'(所以前面的%),索引不会加快速度。所以你可能会在playing_date上留下一个索引,也许是playing_date, channel_report_tag。 -
为什么“喜欢”?!?!?!?国家代码怎么可能是 LIKE ?!?!
标签: mysql performance optimization indexing