2012-07-31 4 views
1

2 백만 행이있는 다음 표가 있습니다. 다음은mysql 큰 테이블 여러 날짜 where 절 쿼리 성능

 
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) 
    
    

    를 실행하고 설명과 질의입니다 누군가 더 나은 지수를 제안 해주세요.

  • where 절에 2 개의 날짜가있는 복합 인덱스를 사용할 수 있습니까? where 절이 있고 조건이 "NOW() BETWEEN actual_start and scheduled_end"이지만 mysql은 키 길이가 96 인 인덱스 'idx_discoverability_gn'만을 사용하고 있습니다. 이는 (media_typeservice_idgenre_idactual_start)이 only.why 그것이 인덱스 개까지 사용할 수는 개까지의 인덱스를 사용하는 수단 (media_type, service_id, genre_id, actual_start, scheduled_end)?
  • 성능을 향상시키기 위해 내가 뭘 할 수 있습니까?

답변

0

클러스터 된 색인 (scheduled_start, actual_start, scheduled_end)이 도움이 될 수 있도록 범위 검사가 있습니다. 현재 색인은별로 쓸모가 없습니다. 기본 색인 (episode_id)과 기본 색인 (service_id, genre-id, episode_id)을 하나씩 만들 수 있습니다.

+0

실제로 비정규 화 된 테이블이며 episode_id는 모든 행에서 고유하지 않습니다. 가능한 기본 키는 ('media_type','service_id','genre_id','actual_start','scheduled_end','scheduled_start','episode_id')입니다. – user1566434