我正在尝试在这里优化查询,但是以某种方式仍然需要30秒钟以上的时间才能执行。

它是这样的:

SELECT v.cd, COUNT(vc.id) as count
FROM vc
INNER JOIN v ON v.uid = vc.vid
WHERE ct > 1393279200 AND pid="12" AND sid="10"
GROUP BY vc.vid;


我已经尝试过使用JOIN进行多种组合,但似乎根本不打算使用JOIN。也许建立子查询会更好?

所需结果:

+--------------+--------------+
|      cd      |     count    |
+--------------+--------------+
| AE           |            1 |
| AM           |            1 |
| AU           |          230 |
| BB           |            1 |
| CA           |          127 |
| CH           |            1 |
| PR           |            3 |
| SA           |            1 |
| SE           |            5 |
| SG           |           12 |
| TH           |            1 |
| US           |         5829 |
| ZA           |            3 |
+--------------+--------------+


设置36行(41.09秒)

所需结果由以下人员产生:

SELECT V.cd, COUNT(VC.id) as count
FROM vc as VC, v V
WHERE ct > 1393279200 AND pid="12" AND sid="10" AND VC.vid = V.uid
GROUP BY V.cd;

最佳答案

创建索引:


create index vcvid on vc (vid)
create unique index vuidcd on v (uid, cd)


注意:在where语句中使用的列也应该在索引中,通常是第一个

运行analyze v; analyze vc; optimize v; optimize vc;

然后尝试以下查询:

select v.cd, q.cnt
from
v use index (vuidcd)
inner join
(
    select vc.vid, count(*) as cnt
    from vc use index (vcvid)
    group by vc.vid
) as q
on (v.uid = q.vid)


如果有问题-尝试对查询使用来查找问题

关于mysql - 使用内部联接优化MySQL查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22006076/

10-13 07:32
查看更多