2016-08-10 2 views
1

약 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 | 
+0

'msg' 열에 색인이 있습니까? 아니면 어떤 인덱스? – aynber

+0

누락 된 정보 :'EXPLAIN'의 결과, 엔진 및 InnoDB 구성이 사용 된 경우 'SHOW CREATE TABLE' 출력. 늘 그렇듯이 이것은'innod_buffer_pool_size' 설정이 충분하지 않아서 발생하는 I/O 문제 일 가능성이 큽니다. 기본값은'128'mb입니다. – Mjh

+0

'show create table largeTable'을 작성하고 게시하십시오. Btw와 코어 카운트는 무관합니다. mysql에 대한 smp는 iffy – Drew

답변

1
EXPLAIN

CREATE TABLE 당신이 WHERE 절을 최적화하기위한 인덱스가없는 것을 말한다. 그리고 그것은 ORDER BY 전에 발생합니다. 먼저 색인 생성에 집중하겠습니다.

그러나
ALTER TABLE largeTable 
    ADD INDEX(msg); 

, 그 때문에 두 가지의 작동하지 않습니다

`msg` varchar(528) NOT NULL, 
ENGINE=MyISAM 

당신이 528 개 문자가 필요하십니까? 255로 낮추면 작동 할 것입니다. (또는 MyISAM의 경우 341)

실행중인 MySQL 버전은 무엇입니까? 5.7은 528 + utf8이 색인이되도록합니다. 5.6도 마찬가지로 할 수 있지만 가능할 수 있도록 몇 가지 조치를 취해야합니다.

관련 문제