1

次の表には200万行が含まれています。

CREATE TABLE `gen_fmt_lookup` (
  `episode_id` varchar(30) DEFAULT NULL,
  `media_type` enum('Audio','Video') NOT NULL DEFAULT 'Video',
  `service_id` varchar(50) DEFAULT NULL,
  `genre_id` varchar(30) DEFAULT NULL,
  `format_id` varchar(30) DEFAULT NULL,
  `masterbrand_id` varchar(30) DEFAULT NULL,
  `signed` int(11) DEFAULT NULL,
  `actual_start` datetime DEFAULT NULL,
  `scheduled_start` datetime DEFAULT NULL,
  `scheduled_end` datetime DEFAULT NULL,
  `discoverable_end` datetime DEFAULT NULL,
  `created_at` datetime DEFAULT NULL,
  KEY `idx_discoverability_gn` (`media_type`,`service_id`,`genre_id`,`actual_start`,`scheduled_end`,`scheduled_start`,`episode_id`),
  KEY `idx_discoverability_fmt` (`media_type`,`service_id`,`format_id`,`actual_start`,`scheduled_end`,`scheduled_start`,`episode_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |

以下は、このテーブルに対して実行している説明付きのクエリです

mysql> EXPLAIN select   episode_id,scheduled_start 
from gen_fmt_lookup  
where media_type='video' 
and service_id in ('mobile_streaming_100','mobile_streaming_200','iplayer_streaming_h264_flv_vlo','mobile_streaming_500','iplayer_stb_uk_stream_aac_concrete','captions','iplayer_uk_stream_aac_rtmp_concrete','iplayer_streaming_n95_3g','iplayer_uk_download_oma_wifi','iplayer_uk_stream_aac_3gp_concrete') 
and genre_id in ('100001','100002','100003','100004','100005','100006','100007','100008','100009','100010') 
and NOW() BETWEEN actual_start and scheduled_end 
group by episode_id order by min(scheduled_start) limit 1 offset 100\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: nitro_episodes_gen_fmt_lookup
         type: range
possible_keys: idx_discoverability_gn,idx_discoverability_fmt
          key: idx_discoverability_gn
      key_len: 96
          ref: NULL
         rows: 31719
        Extra: Using where; Using index; Using temporary; Using filesort
1 row in set (0.16 sec)

だから私の質問は

  • クエリの実行に使用されるインデックスは最適ですか?そうでない場合は、誰かがより良いインデックスを提案できますか?
  • mysqlはwhere句に2つの日付を持つ複合インデックスを使用できますか?上記のクエリのように、where句には「andNOW()BETWEEN actual_start andcheduled_end」という条件がありますが、mysqlはキー長96のインデックス「idx_discoverability_gn」のみを使用しています。これは、インデックス最大(、、、、)のみを使用していることを意味します。インデックス最大(media_type、、、、、service_id)を使用できないgenre_idのはなぜですか?actual_startmedia_typeservice_idgenre_idactual_startscheduled_end
  • パフォーマンスを向上させるために他に何ができますか?
4

1 に答える 1

0

範囲チェックがあるため、(scheduled_start、actual_start、scheduled_end) のクラスター化インデックスが役立つ場合があります。現在のインデックスはあまり役に立ちません。それらを削除して、1 つの主キー (episode_id) と別のインデックス (service_id、genre-id、episode_id) を作成できます。

于 2012-07-31T18:00:26.670 に答える