약 4 백만 개의 메시지 항목이있는 mysql 테이블에서 작업 중이며 타임 스탬프를 기반으로 최신 50 개의 메시지를 선택하려고합니다.Mysql 간단한 쿼리를위한 정렬 인덱스 성능 생성
반환되는 메시지가 고정 된 접두사로 시작되지 않아야한다는 추가 요구 사항이 있습니다.
문제는 단일 쿼리가 약 25 %의 CPU를 사용하며 최대 1.5 초가 소요된다는 것입니다. 쿼리는 여러 클라이언트에서 자주 수행되며 8 코어 db- 서버에서 성능 문제가 발생합니다. 어쩌면 문제는 모든 항목에 대한 접두사 검사 있다는 것을
+----------------------+----------+
| Status | Duration |
+----------------------+----------+
| starting | 0.000044 |
| checking permissions | 0.000004 |
| Opening tables | 0.000010 |
| init | 0.000019 |
| System lock | 0.000005 |
| optimizing | 0.000005 |
| statistics | 0.000007 |
| preparing | 0.000007 |
| Sorting result | 0.000002 |
| executing | 0.000002 |
| Sending data | 0.000006 |
| Creating sort index | 0.788023 |
| end | 0.000009 |
| query end | 0.000003 |
| closing tables | 0.000009 |
| freeing items | 0.000012 |
| cleaning up | 0.000010 |
+----------------------+----------+
은 내가 처음 생각하지만, 프로파일 링 후 :
SELECT * FROM largeTable
WHERE msg NOT LIKE 'myPrefix%'
ORDER BY timestamp DESC LIMIT 0, 50;
나는 여기에 쿼리의 결과이다, 내장 MySQL의 프로파일과 프로파일 링을 시도 .
| Creating sort index | 0.788023 |
범인으로 보입니다. 그래서 ORDER BY 절? 어떻게 속도를 높일 수 있습니까? 이 문제를 해결하기 위해 작성할 수있는 인덱스가 있습니까? 새 메시지가 약 몇 초마다 추가되는 반면 쿼리는 더 자주 발생합니다.
도움 주셔서 감사합니다.
편집 : 의견을 보내 주셔서 감사합니다. 여기 요청 된 정보가 있습니다.
데이터베이스가 내 코드에 의해 작성되지 않고 일부 외부 Python 서비스로 작성되고 채워지지 않습니다. 아직 색인을 추가하지 않았습니다.
출력 설명 :
id:1
select_type:SIMPLE
table:largeTable
type:ALL
possible_keys:NULL
key: NULL
key_len:NULL
ref: NULL
rows: 3492633
Extra: Using where; Using filesort
테이블 구조를 :
CREATE TABLE `largeTable` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`timestamp` int(10) unsigned NOT NULL,
`client_id` int(11) unsigned NOT NULL,
`name` varchar(32) NOT NULL,
`msg` varchar(528) NOT NULL,
`target_id` int(11) unsigned DEFAULT NULL,
`target_name` varchar(32) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `client` (`client_id`)
) ENGINE=MyISAM AUTO_INCREMENT=4013829 DEFAULT CHARSET=utf8 |
'msg' 열에 색인이 있습니까? 아니면 어떤 인덱스? – aynber
누락 된 정보 :'EXPLAIN'의 결과, 엔진 및 InnoDB 구성이 사용 된 경우 'SHOW CREATE TABLE' 출력. 늘 그렇듯이 이것은'innod_buffer_pool_size' 설정이 충분하지 않아서 발생하는 I/O 문제 일 가능성이 큽니다. 기본값은'128'mb입니다. – Mjh
'show create table largeTable'을 작성하고 게시하십시오. Btw와 코어 카운트는 무관합니다. mysql에 대한 smp는 iffy – Drew