mysql中的内连接(to-many连接)

时间:2011-10-13 10:56:16

标签: mysql

  SELECT 
    a.cdrID as cdrID,
    a.userName as userName,
    a.callingStationID as callingStationID,
    a.orgClientAccountID as orgClientAccountID,
    a.terClientAccountID as terClientAccountID,
    a.calledStationID as calledStationID,
    a.setupTime as  setupTime,
    a.connectTime as connectTime,
    a.disconnectTime as disconnectTime,
    a.orgDestCode as  orgDestCode,
    a.orgBilledDuration as  orgBilledDuration,
    a.orgBilledAmount as orgBilledAmount,
    a.terDestCode as terDestCode,
    a.terBilledDuration as terBilledDuration,
    a.terBilledAmount as terBilledAmount,
    a.orgRateID as orgRateID,
    a.terRateID as terRateID,
    b.dtDestName as orgDestName,
    c.dtDestName as terDestName,
    d.clCustomerID as terClientName,
    1 as cdrwsid,
    cast((e.crFlatRate*a.orgBilledAmount)as decimal(10,4)) as cdrsale,
    cast((f.crFlatRate*a.terBilledAmount)as decimal(10,4)) as cdrpurchase,
    cast(((e.crFlatRate*a.orgBilledAmount)-(f.crFlatRate*a.terBilledAmount))as decimal(10,4)) as cdrprofit 
FROM Successful.vbSuccessfulCDR_508 a 
inner join iTelBilling.vbDestination b on a.orgDestCode=b.dtDestCode 
inner join iTelBilling.vbDestination c on a.terDestCode=c.dtDestCode 
inner join iTelBilling.vbClient d on a.terClientAccountID=d.clAccountID 
inner join iTelBilling.vbCallRate e on a.orgRateID=e.crCallRateID 
inner join iTelBilling.vbCallRate f on a.terRateID=f.crCallRateID 
where setupTime between '1317761709564' and '1317804909564' and a.terBilledDuration!=0

我有一个问题,这个查询有时候这个查询在服务器上挂了一段时间运行正常,有时它通过错误到多个连接。任何人都可以告诉我该怎么做。

2 个答案:

答案 0 :(得分:2)

问题听起来像这个查询运行的时间很长;这可能是因为您需要查看查询使用的索引。要获得概述(并且可能优化索引和pks),请使用以下命令:

> EXPLAIN SELECT 
a.cdrID as cdrID,
a.userName as userName,
...

另一个原因可能是,存在死锁情况或情况,因为表被锁定后查询运行的时间很长。如果发生这种情况,执行该查询的其他用户(我假设您在Web服务器上下文中使用它)正在构建“等待行”。执行此查询(正在等待)的每个用户都需要自己的连接。如果发生这种情况,您的服务器会在短时间内耗尽并发连接。

这可以通过两种方式解决:

1)确保您的查询具有更高的性能(检查pks和索引)

2)增加SQL服务器中的并发连接设置:

这可以通过在my.cnf

中将以下值设置为200个连接(例如)来完成
max_connections = 200

3) Optimize your mySQL。确保您的querycache,key-buffer,...设置为拟合值。有关mySQL-Performance调优的更多信息,您会发现here

答案 1 :(得分:1)

可能是引擎尝试使用您的SMALLER查找表来执行连接而不是CRD(呼叫数据记录)的PRIMARY表,如电话系统计费。您正在尝试获取正确的始发/目的地帐单代码和费率。有时,MySQL会先尝试使用较小的表来为您考虑。

确保在“setupTime”上的Successful表上有索引。另外,在顶部添加“STRAIGHT_JOIN”子句

SELECT STRAIGHT_JOIN ...查询的其余部分。

这告诉MySQL根据您按该顺序订购的表进行处理。看来你的目的地,客户和通话费率表的连接分别在他们的连接键上有相应的索引......如果没有创建它们。