1
  1. クエリの実行には約 5 分から 20 分かかります。
  2. このため、負荷スパイクが発生しています。
  3. クエリを書き直すのを手伝ってください。
  4. また、クエリのパフォーマンスを向上させるのに役立ちます。

クエリ:

SELECT DATE(create_time) as createDate, count(url_id) 
  FROM t_notification 
 WHERE domain_id = 185 
   AND type = 12 
   AND create_time >= '2012-12-15' 
GROUP BY createDate

説明

explain select DATE(create_time) as createDate, count(url_id) from t_notification where domain_id = 185 and type = 12 and create_time >= '2012-12-15' group by createDate;
    +----+-------------+----------------+------+---------------------------------+----------+---------+-------+---------+----------------------------------------------+
    | id | select_type | table          | type | possible_keys                   | key      | key_len | ref   | rows    | Extra                                        |
    +----+-------------+----------------+------+---------------------------------+----------+---------+-------+---------+----------------------------------------------+
    |  1 | SIMPLE      | t_notification | ref  | FK_notification_domain,idx_test | idx_test | 5       | const | 9189516 | Using where; Using temporary; Using filesort |
    +----+-------------+----------------+------+---------------------------------+----------+---------+-------+---------+----------------------------------------------+
    1 row in set (0.29 sec)

mysql> show create table t_notification\G
*************************** 1. row ***************************
       Table: t_notification
Create Table: CREATE TABLE `t_notification` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `type` int(11) DEFAULT NULL,
  `content` varchar(512) DEFAULT NULL,
  `create_time` date DEFAULT NULL,
  `domain_id` int(11) DEFAULT NULL,
  `url_id` int(11) DEFAULT NULL,
  `status` int(11) DEFAULT NULL,
  `targetrul_partnerurl_id` int(11) DEFAULT NULL,
  `week_entrances` int(11) DEFAULT NULL COMMENT 'for keyword and target_url',
  PRIMARY KEY (`id`),
  KEY `url_id` (`url_id`),
  KEY `targetrul_partnerurl_id` (`targetrul_partnerurl_id`),
  KEY `FK_notification_domain` (`domain_id`,`id`),
  KEY `idx_test` (`domain_id`,`status`,`type`,`create_time`)
) ENGINE=InnoDB AUTO_INCREMENT=50747991 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
4

2 に答える 2

2

MySQl ドキュメントから

次の SELECT ステートメントを発行するとします。 mysql> SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;

複数列のインデックスが col1 と col2 に存在する場合、適切な行を直接フェッチできます。col1 と col2 に個別の単一列インデックスが存在する場合、オプティマイザーはインデックス マージ最適化 (セクション8.3.1.4「インデックス マージの最適化」を参照) の使用を試みるか、または検索数が少ないインデックスを決定することにより、最も制限の厳しいインデックスの検索を試みます。行を取得し、そのインデックスを使用して行をフェッチします。

テーブルに複数列のインデックスがある場合、オプティマイザーはインデックスの左端のプレフィックスを使用して行を検索できます。たとえば、(col1、col2、col3) に 3 列のインデックスがある場合、(col1)、(col1、col2)、および (col1、col2、col3) にインデックス付き検索機能があります。

type または create_time に使用可能なインデックスがありません。キー idx_test からステータスを削除するか、(type, create_time) または type と create_time で別々に新しいインデックスを作成します。

于 2013-01-17T06:43:57.560 に答える
0

domain_id列 とtype列は where 句で直接使用されるため、複合インデックスを作成することを検討してください。クエリのパフォーマンスが確実に向上します。

于 2013-01-17T06:43:56.580 に答える