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_type
가service_id
가genre_id
가actual_start
)이 only.why 그것이 인덱스 개까지 사용할 수는 개까지의 인덱스를 사용하는 수단 (media_type
,service_id
,genre_id
,actual_start
,scheduled_end
)? - 성능을 향상시키기 위해 내가 뭘 할 수 있습니까?
실제로 비정규 화 된 테이블이며 episode_id는 모든 행에서 고유하지 않습니다. 가능한 기본 키는 ('media_type','service_id','genre_id','actual_start','scheduled_end','scheduled_start','episode_id')입니다. – user1566434