아마존 RDS에서 MySQL 데이터베이스가있는 애플리케이션으로 작업하고 있습니다. 질문의 표는 같은 설정 :MySQL 테이블 인덱스 최적화
CREATE TABLE `log` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`timestamp` datetime NOT NULL,
`username` varchar(45) NOT NULL,
.. snip some varchar and int fields ..
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
이 시스템은 잠시 동안 베타 왔으며 이미 데이터 세트는 매우 거대하고 쿼리 오히려 느린하기 시작했다.
SELECT COUNT(*) FROM log --> 16307224 (takes 105 seconds to complete)
이 표는 거의만을 의미, 일반적으로 완료하는 데 약 100-180 초를 가지고 1000 6000 행 사이 뭔가를 줄 것이다이
SELECT timestamp, username, [a few more] FROM log
WHERE timestamp BETWEEN '2012-03-30 08:00:00' AND '2012-03-30 16:00:00'
AND username='XX'
같은 쿼리 떨어져 하나 개의 보고서를 구축하는 데 사용됩니다 웹 응용 프로그램은 종종 시간이 초과되어 빈 보고서를 남깁니다 (시간 초과를 조사 할 것이지만이 질문은 근본 원인에 대한 것입니다).
저는 데이터베이스에는별로 좋지 않지만, 제 생각 엔 여기에서 저를 죽이는 것입니다. 내가 생각하기에 아마도 어떻게 든 타임 스탬프를 인덱스로 사용해야 할 것입니다. 사용자 이름과 함께하는 시간 기록은 고유성을 제공해야합니다 (ID 필드를 사용하지 않습니다).
최적화에 대한 제안 사항이있는 사람이 있다면 모든 귀가 있습니다.
UPDATE :
표는 이제 SELECT
문 다음
CREATE TABLE `log` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`timestamp` datetime NOT NULL,
`username` varchar(45) NOT NULL,
.. snip ..
`task_id` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `index_un_ts` (`timestamp`,`username`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
EXPLAIN
로 변경되어있을 것 타임 스탬프 열 및 사용자 ID에 다음
id => 1
select_type => SIMPLE
table => log
type => range
possible_keys => index_un_ts
key => index_un_ts
key_len => 55
ref =>
rows => 52258
Extra => Using where; Using index
MyISAM으로 전환 할 수 있습니다. 예를 들어 매일 cron으로 데이터를 집계하고 별도의보고 표에 저장하십시오. –