Mysql查询性能问题

Mysql查询性能问题,mysql,Mysql,我们在专用服务器上按照以下规范运行系统 双Xeon 2.8Ghz 8GB内存 2 x 250GB存储空间 1TB每月数据传输 我所有的代码都是php,数据库都是mysql 目前,我们的数据库中有大约500k条记录;这可能每年增加至少50万美元 我面临的一个问题是,我们的一个主页的加载时间非常高。 我注意到在他们的本地服务器上,加载时间是2秒,在我们的服务器上是18秒。在本地服务器上使用相同的查询和服务器数据库的精确副本 您将采取哪些步骤来找出加载时间差异如此之大的原因? 我们系统中的每个调用

我们在专用服务器上按照以下规范运行系统

  • 双Xeon 2.8Ghz
  • 8GB内存
  • 2 x 250GB存储空间
  • 1TB每月数据传输
我所有的代码都是php,数据库都是mysql

目前,我们的数据库中有大约500k条记录;这可能每年增加至少50万美元

我面临的一个问题是,我们的一个主页的加载时间非常高。 我注意到在他们的本地服务器上,加载时间是2秒,在我们的服务器上是18秒。在本地服务器上使用相同的查询和服务器数据库的精确副本

您将采取哪些步骤来找出加载时间差异如此之大的原因?

我们系统中的每个调用都会加载到数据库中。目前有370k条记录 每个呼叫都与活动、费率和定价模型相关联
我们的查询计算:

a) 每个活动的呼叫总数,
b) 每个活动的总通话费

问题在于,过去通过更新费率、定价、活动开始日期、结束日期等,许多数据(通话费)可能会发生变化。这导致了一些不稳定,因为表格中包括通话费 另一种方法是动态计算通话费用。所以每次有查询时都要在代码中计算它。然而,有40万条记录,每年可能增加100万条

最好的方法是什么? 请参见下面的查询字符串:

a) 平台活动潜在客户数据查询

SELECT c.tariff, c.campaign_name, c.ad_status, c.ad_control, cd.company, cd.customer_name, pm.pricing_model_name, c.start_date, c.end_date,
(
SELECT p.payment_date
FROM payments p
WHERE p.campaign_id = c.campaign_id
ORDER BY p.payment_date DESC
LIMIT 1) AS LastPaidOn,
(
SELECT p.payment_amount
FROM payments p
WHERE p.payment_status = 'Complete' AND p.campaign_id = c.campaign_id
ORDER BY p.payment_date DESC
LIMIT 1) AS LastPaidAmount,
(CASE WHEN NOW() BETWEEN c.start_date AND c.end_date THEN 'Live' ELSE 'Dead' END) AS STATUS,
(CASE WHEN c.group_name = c.campaign_id THEN '' ELSE c.group_name END)
 AS group_name_processed,
(
SELECT IFNULL(SUM(call_leads_purchased),0)
FROM payments
WHERE campaign_id = c.campaign_id AND payment_status = 'Complete') AS CallLeadsPurchased,
(
SELECT IFNULL(SUM(cd.call_leads_used),0)
FROM call_data cd
WHERE cd.campaign_id = c.campaign_id) AS CallLeadsUsed
FROM campaign_data c
JOIN customer_details cd ON cd.customer_id = c.customer_id
JOIN pricing_model pm ON pm.pricing_model_id = c.pricing_model_id
HAVING STATUS = 'Live'
ORDER BY c.campaign_name
b) 仪表板查询

/电话摘要/

/用于饼图/


我假设您没有配置mysql实例,并且使用默认设置运行,这意味着mysql没有使用任何高级功能将工作数据集保存在内存中,您直接从HDD读取所有内容。运行
显示变量,如“%buffer\u pool%”
,发布该变量的输出。向我们展示您在上述表上使用的索引,并在每个
选择
查询前添加
解释
,运行它并检查它的内容。+N.B.建议,它们是InnoDB表吗?在这种情况下,您需要查看innodb\u buffer\u pool\u size。。。等
SELECT
(
SELECT SUM(call_leads_used)
FROM call_data cd
WHERE 1 = 1 AND cd.call_date >= '2010-03-06' AND campaign_id IN(6)) AS SummaryCallLeadsUsed,
(
SELECT COUNT(*)
FROM call_data cd
WHERE 1 = 1 AND cd.call_date >= '2010-03-06' AND campaign_id IN(6)) AS SummaryReceivedCalls,
(
SELECT COUNT(*)
FROM call_data cd
WHERE 1 = 1 AND cd.call_date >= '2010-03-06' AND campaign_id IN(6) AND cd.call_status = 'Unanswered') AS SummaryUnanswered,
(
SELECT SUM(call_leads_used)
FROM call_data cd
WHERE campaign_id IN(6)) AS TotalCallLeadsUsed,
(
SELECT SUM(call_leads_purchased)
FROM payments
WHERE campaign_id IN(6) AND payment_status = 'Complete') AS TotalLeadsPurchased
SELECT
'Free Calls' AS TYPE, COUNT(*) AS calls
FROM call_data cd,
campaign_data cad
WHERE cd.campaign_id = cad.campaign_id AND cd.call_date >= '2010-03-06' AND cd.is_processed = 1 AND cd.applied_charges = 0 AND cad.customer_id = 6
GROUP BY cad.customer_id UNION
SELECT
'Charged Calls' AS TYPE, COUNT(*) AS calls
FROM call_data cd,
campaign_data cad
WHERE cd.campaign_id = cad.campaign_id AND cd.call_date >= '2010-03-06' AND cd.is_processed = 1 AND cd.applied_charges > 0 AND cad.customer_id = 6
GROUP BY cad.customer_id

/*For Calls per day chart*/
SELECT COUNT(*) AS calls, DATE_FORMAT(call_date, '%Y-%m-%d') AS call_day
FROM call_data cd,
campaign_data cad
WHERE cd.campaign_id = cad.campaign_id AND cd.call_date >= '2010-03-06' AND cd.is_processed = 1 AND cad.customer_id = 6
GROUP BY call_day
ORDER BY call_day

/*For total pages */
SELECT COUNT(*) AS expr
FROM call_data cd,
campaign_data cad
WHERE cd.campaign_id = cad.campaign_id AND cd.is_processed = 1 AND cd.call_date >= '2010-03-06' AND cad.customer_id = 6

/*Calls data*/
SELECT
cad.campaign_name,
cd.call_date,
cd.caller_id,
cd.call_duration,
cd.call_status,
cd.call_duplication,
cd.applied_charges
FROM call_data cd,
campaign_data cad
WHERE cd.campaign_id = cad.campaign_id AND cd.is_processed = 1 AND cd.call_date >= '2010-03-06' AND cad.customer_id = 6
ORDER BY cd.call_date DESC
LIMIT 0, 20