0

次の仕様の専用サーバーでシステムを実行します

  • デュアルXeon2.8Ghz
  • 8GBのRAM
  • 2x250GBストレージ
  • 1TBの月間データ転送

私のコードはすべてphpであり、データベースはmysqlです。

現在、データベースには約50万件のレコードがあります。これは毎年少なくとも50万増加する可能性があります

メインページの1つで非常に長い読み込み時間の問題に直面しています。ローカルサーバーではロード時間が2秒で、サーバーでは18秒であることに気付きました。同じクエリとローカルサーバー上のサーバーデータベースの正確なコピーを使用します。

読み込み時間にこれほど大きな違いがある理由を見つけるために、どのような手順を実行しますか?

システムを介して行われる各呼び出しは、データベースにロードされます。現在、37万件のレコードがあります。 各通話は、キャンペーン、料金、価格設定モデルに関連付けられています。
私たちのクエリは以下を計算します:

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)ダッシュボードクエリ

/通話概要/

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
4

0 に答える 0