以下

2016-09-12 5 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の速度を向上させます@drewが

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; 

と第二のテーブルを要求したとしても、CREATE TABLEを

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をスキップしてビッグデータに対して4回の無条件クエリを実行すると、「ハードコーディング」WHERE galaxy = 1(or 2,3,4 respectively)の場合、それぞれ約0.05秒かかります。

なぜ起こるのだろうか。私はLEFT JOINが、月などmoonsizeなど(私が選択していない)を使用していないbigdataの列のデータを多く使用している可能性があると推測します。おそらくJOIN自体は時間です実際にはテーブルを実際に結合せずにビッグデータから4つの選択肢を実行することができます。

ここではJOINを誤って使用していますか?

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

あなたはsmalldata(userid, id)にインデックスを持っていることを確認してください:

+0

'show create table bigdata'は' describe'ではありません – Drew

+0

なぜ 'JOIN'ではなく' LEFT JOIN'ですか? –

+0

'SUM(planet)'は論理的な意味を持ちません。 –

答えて

1

は、このようなコードを書いてみてください。あなたの説明に基づいて、あなたはbigdatagalaxyはインデックスの最初のキーでなければならず、planetはインデックスになければなりません)に正しいインデックスを持つように見えます。

+0

不幸にも、実行は長くなります – Mike

+0

@Mike。 。 。あなたは 'bigdata(galaxy)'か、それとも 'bigdata(galaxy、planet)'にインデックスを持っていますか? –