반응형
MySQL에서 매우 느린 쿼리를 최적화하는 방법을 알아 내려고 노력 중입니다 (저는 이것을 설계하지 않았습니다).
SELECT COUNT(*) FROM change_event me WHERE change_event_id > '1212281603783391';
+----------+
| COUNT(*) |
+----------+
| 3224022 |
+----------+
1 row in set (1 min 0.16 sec)
전체 개수와 비교 :
select count(*) from change_event;
+----------+
| count(*) |
+----------+
| 6069102 |
+----------+
1 row in set (4.21 sec)
설명문은 여기서 도움이되지 않습니다.
explain SELECT COUNT(*) FROM change_event me WHERE change_event_id > '1212281603783391'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: me
type: range
possible_keys: PRIMARY
key: PRIMARY
key_len: 8
ref: NULL
rows: 4120213
Extra: Using where; Using index
1 row in set (0.00 sec)
그래도 계산하는 데 약 4 백만 개의 항목이 필요하다고 생각하지만 파일의 줄을 그보다 더 빨리 계산할 수 있습니다! MySQL이 왜 이렇게 오래 걸리는지 이해할 수 없습니다.
테이블 정의는 다음과 같습니다.
CREATE TABLE `change_event` (
`change_event_id` bigint(20) NOT NULL default '0',
`timestamp` datetime NOT NULL,
`change_type` enum('create','update','delete','noop') default NULL,
`changed_object_type` enum('Brand','Broadcast','Episode','OnDemand') NOT NULL,
`changed_object_id` varchar(255) default NULL,
`changed_object_modified` datetime NOT NULL default '1000-01-01 00:00:00',
`modified` datetime NOT NULL default '1000-01-01 00:00:00',
`created` datetime NOT NULL default '1000-01-01 00:00:00',
`pid` char(15) default NULL,
`episode_pid` char(15) default NULL,
`import_id` int(11) NOT NULL,
`status` enum('success','failure') NOT NULL,
`xml_diff` text,
`node_digest` char(32) default NULL,
PRIMARY KEY (`change_event_id`),
KEY `idx_change_events_changed_object_id` (`changed_object_id`),
KEY `idx_change_events_episode_pid` (`episode_pid`),
KEY `fk_import_id` (`import_id`),
KEY `idx_change_event_timestamp_ce_id` (`timestamp`,`change_event_id`),
KEY `idx_change_event_status` (`status`),
CONSTRAINT `fk_change_event_import` FOREIGN KEY (`import_id`) REFERENCES `import` (`import_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
버전:
$ mysql --version
mysql Ver 14.12 Distrib 5.0.37, for pc-solaris2.8 (i386) using readline 5.0
내가 놓친 명백한 것이 있습니까? (예, 이미 "SELECT COUNT (change_event_id)"를 시도했지만 성능 차이는 없습니다.)
해결 방법
InnoDB는 클러스터 된 기본 키를 사용하므로 기본 키는 별도의 인덱스 페이지가 아닌 데이터 페이지의 행과 함께 저장됩니다. 범위 스캔을 수행하려면 데이터 페이지에서 잠재적으로 넓은 행을 모두 스캔해야합니다. 이 테이블에는 TEXT 열이 포함되어 있습니다.
내가 시도 할 두 가지 :
(0에서 증가하는 경우 change_event_id 열을 bigint unsigned 로 만들고 싶을 수도 있습니다)
참조 페이지 https://stackoverflow.com/questions/511820
반응형
'MySql' 카테고리의 다른 글
MySQL 쿠키에 저장된 정보 암호화 및 복호화 (0) | 2020.10.17 |
---|---|
MySQL 오류 : IP 주소에서 호스트 이름을 가져올 수 없습니다. (0) | 2020.10.17 |
MySQL mysql에서 float 유형을 올바르게 사용하는 방법은 무엇입니까? (0) | 2020.10.17 |
MySQL은 innodb 테이블의 행 수를 얻습니다. (0) | 2020.10.17 |
MySQL 이 "MySQL 오류 # 1054-알 수없는 열"오류의 원인은 무엇입니까? (0) | 2020.10.17 |
댓글