0

1) 使用第一个查询...大约需要 23 秒

select a.id from mza_movie_upload a,mza_movie_statics b 
where a.status=1 and b.download=1 and a.id=b.rid 
group by b.rid order by sum(b.download) desc

目前我修改了查询..这大约需要 9 秒

select a.id from mza_movie_upload a 
INNER JOIN mza_movie_statics b 
ON a.id=b.rid WHERE a.status=1 and b.download=1 
group by b.rid order by sum(b.download) desc

explain select a.id from mza_movie_upload a  INNER JOIN mza_movie_statics b  ON     a.id=b.rid WHERE a.status=1 and b.download=1  group by b.rid order by sum(b.download) desc;
+----+-------------+--------+--------+------------- --+---------+----------+----------+---- -----+-------------------------------------------- --+
| 编号 | 选择类型 | 表| 类型 | 可能的键 | 关键 | key_len | 参考 | 行 | 额外 |
+----+-------------+--------+--------+------------- --+---------+----------+----------+---- -----+-------------------------------------------- --+
| 1 | 简单 | 乙 | 全部 | 空 | 空 | 空 | 空 | 1603089 | 使用哪里;使用临时的;使用文件排序 |
| 1 | 简单 | 一个 | eq_ref | 初级 | 初级 | 4 | mmdfurni_dev11.b.rid | 1 | 使用位置 |
+----+-------------+--------+--------+------------- --+---------+----------+----------+---- -----+-------------------------------------------- --+
2 行(0.03 秒)

我不确定要做什么?我希望这个查询很快..我试图索引 rid 和 id 仍然使查询变得更糟。

这是表的详细信息

mza_movie_upload

+---------------+--------------+------+-----+----- ----+----------------+
| 领域 | 类型 | 空 | 钥匙 | 默认 | 额外 |
+---------------+--------------+------+-----+----- ----+----------------+
| 编号 | 整数(11) | 否 | 优先级 | 空 | 自动增量 |
| 用户名 | varchar(200) | 否 | | 空 | |
| 电子邮件 | varchar(200) | 否 | | 空 | |
| 更新 | 日期时间 | 否 | | 空 | |
| 文件大小 | varchar(200) | 否 | | 空 | |
| 临时文件名 | varchar(200) | 否 | | 空 | |
| 文件名 | varchar(200) | 否 | 穆尔 | 空 | |
| 文件路径 | varchar(255) | 否 | | 空 | |
| 状态 | varchar(20) | 否 | | 空 | |
| 知识产权 | varchar(200) | 否 | | 空 | |
| 类别 | varchar(200) | 否 | | 空 | |
| 代码 | 大整数(20) | 否 | | 空 | |
| 电影名 | varchar(200) | 否 | | 空 | |
+---------------+--------------+------+-----+----- ----+----------------+
13 行一组(0.00 秒)

mza_movie_statics

+-----------+---------+------+-----+---------+---- ------------+
| 领域 | 类型 | 空 | 钥匙 | 默认 | 额外 |
+-----------+---------+------+-----+---------+---- ------------+
| 编号 | 整数(11) | 否 | 优先级 | 空 | 自动增量 |
| 摆脱| 整数(11) | 否 | | 空 | |
| uid | 整数(11) | 否 | | 空 | |
| 保存 | 整数(11) | 否 | | 空 | |
| 下载 | 整数(11) | 否 | | 空 | |
| 输入日期 | 日期 | 否 | | 空 | |
+-----------+---------+------+-----+---------+---- ------------+
6 行一组(0.00 秒)
4

3 回答 3

0

如果您希望看到进一步的性能提升,我建议您在 a.status 和/或 b.download 上应用索引。请记住,在插入/更新/删除记录方面,创建额外的索引确实会带来额外的开销——在这种情况下,这似乎是必要的。

此外,在向这些表添加新索引之前(大概在您的生产环境中),请记住 mysql 将创建表的临时副本,对于具有大量记录(> 100 万)的表可能需要一段时间。(所以我建议在类似大小的桌子上进行本地测试)

最后,我注意到在您的查询中,您的 where 子句中有:a.status=1 但是状态列是 varchar。为了避免在两种不同的数据类型之间进行转换(这会减慢查询执行时间),并可能破坏您未来的索引,我建议将其更改为:a.status='1'(注意引号)

于 2013-09-29T14:08:45.450 回答
0

尝试将查询重写为:

SELECT b.rid 
FROM mza_movie_upload a 
INNER JOIN mza_movie_statics b 
ON a.id=b.rid 
WHERE a.status= '1'  and b.download= '1'  
-- group by b.rid order by sum(b.download) desc;
GROUP BY b.rid ORDER BY count(*) DESC;

在这个查询SELECT a.id中被替换为SELECT b.rid, 并且由于JOIN ... ON a.id=b.rid谓词而与原始查询 100% 等效,但导致 MySql 的计划更好一些

,并且正如@Dennis Leon 所建议的那样,a.status= '1' and b.download= '1'与字符串进行比较,而不是数字。

也尝试替换order by sum(b.download) descorder by count(*) desc- 因为查询只检索 b.download = '1' 的行,然后sum( b.download )相当于count(*)- 此更改允许在从字符串转换为数字时节省数百毫秒SUM( .. )

最后创建两个索引:

create index bbbb on mza_movie_statics( download, rid );
create index aaaaa on mza_movie_upload( status );

然后尝试上述更改后的查询速度。

于 2013-09-29T21:03:14.127 回答
0

如果您拥有被视为 COVERING 索引的内容,则可以更好地优化您的查询。也就是说...索引具有与您要查找的内容相关联的列,包括标准。这样引擎就不必去原始数据来实际检查各自的状态和下载部分。

因此,在 mza_movie_upload 上有一个索引 (id, status) 在 mza_movie_statics 上有一个索引 (rid, download)

接下来,group by 将在驱动查询的索引上工作得最好,并且由于 a.id = b.rid,但 a.id 可以是驱动索引,让 IT 成为按值分组。

select
      mu.id
   from
      mza_movie_upload mu
         JOIN mza_movie_statics ms
            on mu.id = ms.rid
           AND ms.download > 0
   group by
      b.rid
   order by
      sum( b.download ) DESC

现在,关于下载的评论。它似乎是一个数字,因此您可能不想明确地与“1”进行比较,因为该列似乎是下载某些内容的次数的计数器。您正在寻找的是下载次数最多的东西。如果这始终是 1 的值,那么是的,将其保留为 = 1 而不是 > 0。

于 2013-09-30T01:15:16.427 回答