2014-02-25 40 views
0

我试图在这里优化我的查询,但不知何故仍需要30多秒才能执行。使用内部连接优化MySQL查询

这是它的外观:

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; 
+0

你有一个'v.uid = vc.vid' –

+1

的索引你为什么按'vc.vid'分组,但选择'v.cd'?给我们表格结构,样本数据和期望的结果 –

+0

看起来像索引问题。连接通常比子查询更高效......你可以分享你的模式吗? – bpaul

回答

0

创建索引:

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

注:列其在声明应该在索引使用过,一般首当其冲

运行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) 

如果会出现问题 - 尝试使用explain extended查询发现问题

+0

是的,我不得不创建2个索引,现在它的速度快了40倍以上:) – Jason

+0

@Jason是啊,错过了你的评论:)无论如何 - 检查这个变种,也许会更快 –