2014-01-10 1 views
1

MySQL에서 수백만 개의 레코드가있는 테이블이 있습니다.> InfoBook에 가져온 데이터는 wiki 페이지의 노트를 사용하여 가져오고 아무런 문제가 없습니다! 여기 SELECT 쿼리에 대한 테이블 구조의 브라이트 하우스 최적화

지금은 선택 쿼리를 450 번, 때마다 'A'와 같은 제약 조건을 사용중인 다른를 실행하는 데 필요한 테이블 구문

CREATE TABLE `myTable` (
    `a` varchar(255) COLLATE latin1_bin DEFAULT NULL, 
    `b` varchar(255) COLLATE latin1_bin DEFAULT NULL, 
    `c` bigint(20) NOT NULL, 
    `d` bigint(20) NOT NULL, 
    `e` int(10) NOT NULL 
) ENGINE=BRIGHTHOUSE 

입니다 :

SELECT d,e FROM `myTable` WHERE a = 'myString'; 

목표는 전체 쿼리가 호출되는 시간을 단축하는 것입니다. 하지만 문제가 있습니다. 선택 쿼리를 약 450 번 실행하면 평균적으로 각 쿼리의 길이는 0.52 초가됩니다.

그러나 MySQL을 통해 실행할 때 쿼리 당 약 1.7 밀리 초가 걸립니다!

어떻게하면 MySQL 시간을 이길 수 있을까요? ''대신 ''대신 'IN'절을 사용해야합니까, 'a'의 ontop을 추가로 선택해야합니까? 예 :

SELECT a,d,e FROM `myTable` WHERE a IN ('myString1','myString2'.... etc) 

답변

2

Infobright은 (는 조건을 쿼리에 관해서 특히 때) 숫자 데이터로 작업에 탁월한. 그들은 "지식 그리드"메타 데이터 시스템을 사용하기 때문에 전통적인 BTREE 색인을 지원하지 않습니다. WHERE a = 'myString'을 실행하면 엔진이 모든 packrow (일반적으로 packrow 당 50,000 행의 데이터)를 열고 각 레코드에 대해 문자열 비교를 수행하게됩니다.

MySQL은 BTREE 색인을 지원합니다. 여기에서 언급 한 것처럼 텍스트 기반 쿼리 조건에서 더 나은 성능을 제공합니다. 당신이 쿼리를 450 번 실행해야한다고 말했을 때, 나는 적어도 450 개의 고유 값을 가지고 있다고 가정 할 것이다.

당신은 고유 값의 매우 작은 세트 (같은 ... 예를 들어, 상태 표시기의 일종), 당신은 크게 LOOKUP 컬럼으로 정의하는 혜택을 누릴 것입니다와 같은 텍스트 열이있는 경우

`a` varchar(255) COLLATE latin1_bin DEFAULT NULL COMMENT 'lookup' 

참고 : 테이블 설정의이 종류는 바람직 쿼리의 집합의 VARCHAR위한 작은 크기 할당()가 아닌 255

으로 낮은 카디널리티 열에 대한 최적의 성능을 제공합니다, 당신은 아마 더 좋을 것이다 MySQL을 고수하거나 데이터를 다시 작업하여 Infobright의 수치 데이터로 변환하십시오.

이 질문은 약 4 개월이되기 때문에, 나는이 질문을 누군가에게 참고로 게시하고 있습니다.