CREATE TABLE campaigns (
domain varchar(50) DEFAULT NULL,
campaign_id varchar(50) DEFAULT NULL,
node_id varchar(50) DEFAULT NULL,
subscriber_id varchar(50) DEFAULT NULL,
message varchar(21000) DEFAULT NULL,
log_time datetime DEFAULT NULL,
log_type varchar(50) DEFAULT NULL,
campaign_name varchar(500) DEFAULT NULL
KEY `campid_domain_logtype_logtime_subid_index` (`campaign_id`,`domain`,`log_type`,`log_time`,`subscriber_id`),
KEY `domain_logtype_logtime_index` (`domain`,`log_type`,`log_time`)
)
上記はMySqlのテーブルのスキーマです。 1つのキャンペーンは複数のノードを持つことができます。MySqlが複合インデックスを処理する方法
インデックスcampid_domain_logtype_logtime_subid_index
は、レポートw.r.tの特定のキャンペーンで問題なく動作します。
最近このノードにnode_idを追加しました。これで特定のノードのレポートが必要になりました。だから今
私はキャンペーンレベルとノード・レベルの両方をサポートするために、次のように私たちの被覆率が変化するつもりは
campid_nodeid_domain_logtype_logtime_subid_index
を報告します。特定のキャンペーンの特定のノードIDでのレポートの特定のキャンペーン
SELECT log_type,
count(DISTINCT subscriber_id) AS count,
count(subscriber_id) AS total
FROM stats.campaign_logs USE INDEX(campid_domain_logtype_logtime_subid_index)
where domain = 'aaa' AND campaign_id='12345' AND
log_type in ('EMAIL_SENT','EMAIL_OPENED','EMAIL_CLICKED')
AND log_time BETWEEN CONVERT_TZ('2016-03-13 00:00:00','+01:30','+00:00') AND CONVERT_TZ('2016-04-13 23:59:59','+01:30','+00:00')
GROUP BY log_type;
例のクエリについてのレポートのための
例クエリ
SELECT
log_type,
count(DISTINCT subscriber_id) AS count,
count(subscriber_id) AS total
FROM stats.campaign_logs USE INDEX(campid_domain_logtype_logtime_subid_index)
where domain='aaa' AND campaign_id='12345' AND
node_id = '56789' and
log_type in ('EMAIL_SENT','EMAIL_OPENED','EMAIL_CLICKED')
AND log_time BETWEEN CONVERT_TZ('2016-03-13 00:00:00','+01:30','+00:00') AND CONVERT_TZ('2016-04-13 23:59:59','+01:30','+00:00')
GROUP BY log_type;
だから私の質問は、この新しい指標は、効果的にクエリの私たちのようなものの両方を満足さありませんそうでない場合は、適切なインデックスを提案してください。
UPDATE:表の
データ分布
1ドメイン20
1キャンペーンが
1キャンペーンを有することができ、例えば10複数のノードを持つことができ、例えば、複数のキャンペーンを有することができますたとえば複数のログタイプ50
1キャンペーンcan ha多くのユーザなど100,000
1ログを保存するときにmysql now()を使用するため、キャンペーンのログ時間が長くなることがあります。
UPDATE
おかげ
各フィールドの選択性を追加できますか?ユニークな値はどれくらいですか –
テーブルにはどのくらいのドメインがありますか? –
今はarround 4kです。いくつかのドメインはわずかな行しか持たず、いくつかのドメインはテーブルの行数が多いです。 – Rams