내 두 개의 테이블 내가 (이 더미 데이터베이스 그래서 당기하고있어 데이터에 관심을 지불하지 않는 참고)에서 데이터는 빅 데이터
> 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을 잘못 사용하고 있습니까? 다음과 같은 코드를 작성
'show create table bigdata'는'describe'가 아닙니다. – Drew
왜'JOIN' 대신에'LEFT JOIN'입니까? –
'SUM (행성)'은 논리적으로 의미가 없습니다. –