が、私は(私は引っ張ってるどのデータに注意を払っていない、これらはダミーのデータベースであることに注意してください)以下
> 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)
にインデックスを持っていることを確認してください:
'show create table bigdata'は' describe'ではありません – Drew
なぜ 'JOIN'ではなく' LEFT JOIN'ですか? –
'SUM(planet)'は論理的な意味を持ちません。 –