2016-09-12 2 views
0
아래

내 두 개의 테이블 내가 (이 더미 데이터베이스 그래서 당기하고있어 데이터에 관심을 지불하지 않는 참고)에서 데이터는 빅 데이터

> DESCRIBE bigdata; 

+----------------+----------------------+------+-----+---------+-------+ 
| Field   | Type     | Null | Key | Default | Extra | 
+----------------+----------------------+------+-----+---------+-------+ 
| galaxy   | int(2)    | NO | PRI | 0  |  | 
| system   | int(3)    | NO | PRI | 0  |  | 
| planet   | int(2)    | NO | PRI | 0  |  | 
| ogame_playerid | int(11) unsigned  | NO | MUL | 0  |  | 
| moon   | enum('true','false') | NO |  | false |  | 
| moonsize  | smallint(5) unsigned | NO |  | 0  |  | 
| metal   | int(10) unsigned  | NO |  | 0  |  | 
| crystal  | int(10) unsigned  | NO |  | 0  |  | 
| planetname  | varchar(40)   | NO |  |   |  | 
+----------------+----------------------+------+-----+---------+-------+ 

을 인출 할 수 있습니다에 가입 MySQL을 속도를 향상 @ 드류가

CREATE TABLE `bigdata` (
    `galaxy` INT(2) NOT NULL DEFAULT '0', 
    `system` INT(3) NOT NULL DEFAULT '0', 
    `planet` INT(2) NOT NULL DEFAULT '0', 
    `ogame_playerid` INT(11) UNSIGNED NOT NULL DEFAULT '0', 
    `moon` ENUM('true','false') NOT NULL DEFAULT 'false', 
    `moonsize` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0', 
    `metal` INT(10) UNSIGNED NOT NULL DEFAULT '0', 
    `crystal` INT(10) UNSIGNED NOT NULL DEFAULT '0', 
    `planetname` VARCHAR(40) NOT NULL DEFAULT '', 
    PRIMARY KEY (`galaxy`, `system`, `planet`), 
    INDEX `player_id` (`ogame_playerid`) 
) 
COLLATE='utf8_general_ci' 
ENGINE=MyISAM; 

두 번째 테이블을 요청한 또한 테이블 만들기

SELECT * FROM smalldata WHERE userid = 1; 
+----+--------+----------------+---------------------+ 
| id | userid | ip    | logintime   | 
+----+--------+----------------+---------------------+ 
| 1 |  1 | 127.0.0.1  | 2016-02-25 13:50:59 | 
| 2 |  1 | ::1   | 2016-02-29 23:22:18 | 
| 3 |  1 | 127.0.0.1  | 2016-03-14 22:52:22 | 
| 4 |  1 | 127.0.0.1  | 2016-03-22 23:27:02 | 
+----+--------+----------------+---------------------+ 

(자세한 사용자 ID의이 참고) 내 내 관심사는 내가 한 번에 4 smalldata의 ID를 선택을 자동화 해주는 등의 쿼리를 실행하는 경우가 완료 될 때까지 약 10 초 정도이다

SELECT smalldata.id, SUM(bigdata.planet) 
FROM smalldata LEFT JOIN bigdata ON smalldata.id = bigdata.galaxy 
WHERE smalldata.userid = 1 
GROUP BY smalldata.id; 

다음과 같이 쿼리입니다. 그러나 LEFT JOIN을 건너 뛰고 bigdata에서 4 개의 무차별 쿼리를 실행하면 "하드 코딩"WHERE galaxy = 1(or 2,3,4 respectively), 그 다음 약 0.05 초가 걸린다.

왜 이런 일이 발생하는지 궁금합니다. 나는 LEFT JOIN이 bigdata에있는 컬럼의 많은 데이터를 활용할 것이라고 추정한다. 나는 달과 같은 moonsize 등을 사용하지 않는다. 아마도 JOIN 자체가 시간 일 것이다. 사실 내가 테이블에 실제로 합류하지 않고 bigdata에서 4 가지 선택을 수행 할 수있는 곳을 소비합니다.

여기에 JOIN을 잘못 사용하고 있습니까? 다음과 같은 코드를 작성

+0

'show create table bigdata'는'describe'가 아닙니다. – Drew

+0

왜'JOIN' 대신에'LEFT JOIN'입니까? –

+0

'SUM (행성)'은 논리적으로 의미가 없습니다. –

답변

1

시도 :

SELECT smalldata.id, 
     (SELECT SUM(bigdata.planet) 
     FROM bigdata 
     WHERE smalldata.id = bigdata.galaxy 
     ) 
FROM smalldata 
WHERE smalldata.userid = 1 ; 

당신이 smalldata(userid, id)에 인덱스를 가지고 있는지 확인하십시오. 설명에 따라 bigdata에 올바른 색인이있는 것 같습니다 (galaxy은 색인의 첫 번째 열쇠 여야하고 planet은 색인에 있어야합니다).

+0

불행히도 실행은 길다. – Mike

+0

@Mike. . . '빅 데이터 (은하)'에 대한 색인이 있습니까, 아니면 '빅 데이터 (은하, 행성)'입니까? –

관련 문제