3

次の MySQL MyISAM テーブルのサイトでヒットを追跡しています。

CREATE TABLE `track_hits` (
  `hit_id` int(10) unsigned NOT NULL auto_increment,
  `referer` varchar(255) default NULL,
  `referer_checksum` int(10) default NULL,
  `domain_checksum` int(10) default NULL,
  `referer_local` enum('Yes','No') default NULL,
  `request` varchar(255) default NULL,
  `request_checksum` int(10) default NULL,
  `embed_id` int(10) unsigned default NULL,
  `embed_user_id` int(10) unsigned default NULL,
  `embed_campaign_id` int(10) unsigned default NULL,
  `date` datetime default NULL,
  `day_checksum` int(10) default NULL,
  `visit_id` int(10) unsigned default NULL,
  PRIMARY KEY  (`hit_id`),
  KEY `referer_checksum` (`referer_checksum`),
  KEY `date` (`date`),
  KEY `visit_id` (`visit_id`),
  KEY `embed_user_id` (`embed_user_id`),
  KEY `embed_campaign_id` (`embed_campaign_id`),
  KEY `day_checksum` (`day_checksum`),
  KEY `domain_checksum` (`domain_checksum`),
  KEY `embed_id` (`embed_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

テーブルには 500 万行を超える行があります。

特定の日付範囲内の 1 日visit_idあたりのキャンペーン ( ) あたりの合計ヒット数とユニーク数 (個別の に基づく) の合計数が必要です。embed_campaign_id私はこのクエリでそれをやっています:

SELECT COUNT(DISTINCT h.`visit_id`) AS `visits`, COUNT(h.`hit_id`) AS `hits`, `date`
FROM (`track_hits` h)
WHERE `h`.`embed_campaign_id` = '31'
AND `h`.`date` >= '2012-10-07 07:00:00'
AND `h`.`date` <= '2012-11-07 07:59:59'
GROUP BY `h`.`day_checksum`

実行には約 15 ~ 25 秒かかります。

day_checksum日付の crc32 エンコード バージョン、つまり「2012-11-07」です。速度が上がらないものに交換しましたGROUP BYDATE(h.date)

EXPLAIN は次を返します。

id  select_type table   type    possible_keys           key                 key_len     ref     rows        extra
1   SIMPLE      h       ref     date,embed_campaign_id  embed_campaign_id   5           const   1648683     Using where; Using filesort

1 日ごとの集計テーブルを使用することを考えましたが、サイトはローカライズされており、データベース内のすべての日付は GMT です。したがって、10/07 @ 7PM EST から 11/07 @7PM EST までは、10/07 @ 7PM PST から 11/07 @7PM PST までとは異なるカウントを返す必要があります。

それをスピードアップする方法はありますか?

4

2 に答える 2

2

列ごとにインデックスがあります。複合 (複数列) インデックスを使用すると、パフォーマンスが向上すると思います。

http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html

このようなもの:

KEY compositeIndex (embed_campaign_id, date, day_checksum, visit_id, hit_id)
于 2012-11-07T08:17:39.837 に答える
0

いくつかのワイルドな推測:

  • するanaylize table
  • エンジンを InnoDB に変更
  • dateにない場合はgroup by、完全に除外するか、 に置き換えるか、day_checksum両方を に変更しますdate(date)
  • 周りのブレースを外しますfrom (track_hits h)
  • ハードウェアがボトルネックではないことを確認してください

最後に、1 日 1 回 15 秒から 25 秒は、それほど長く待つ必要はありません。

于 2012-11-07T08:13:27.853 に答える