SELECT date( timestamp ) as date, min( time ), avg( time )where で使う全てのフィールドにはインデックスを付けているけど、この場合だと filesort が使われてしまい 0.0050 〜 0.0100 秒程かかる。
FROM `fastcap_200810heap`
WHERE `player` = 'xsd|z1'
AND `map` = 'q3wcp6'
AND `gametype` =1
AND `promode` =0
GROUP BY `date`
ORDER BY `date` ASC;
CREATE TEMPORARY TABLE `tmp1` SELECT * FROM `fastcap_200810heap` WHERE `player` = 'xsd|z1';しかしこうすると 0.0005 秒になる。HEAPテーブルなので全てメモリ内で完結出来るわけか。
CREATE TEMPORARY TABLE `tmp2` SELECT * FROM `tmp1` WHERE `map` = 'q3wcp6';
CREATE TEMPORARY TABLE `tmp3` SELECT * FROM `tmp2` WHERE `gametype` =1;
CREATE TEMPORARY TABLE `tmp4` SELECT * FROM `tmp3` WHERE `promode` =0;
SELECT date( timestamp ) as date, min( time ), avg( time )
FROM `tmp4`
GROUP BY `date`
ORDER BY `date` ASC;
CREATE TEMPORARY TABLE `tmp1` SELECT * FROM `fastcap_200810heap` WHERE `player` = 'xsd|z1';メモリの節約を考えた場合こうなる? ややこしい。
CREATE TEMPORARY TABLE `tmp2` SELECT * FROM `tmp1` WHERE `map` = 'q3wcp6';
DROP TEMPORARY TABLE `tmp1`;
CREATE TEMPORARY TABLE `tmp3` SELECT * FROM `tmp2` WHERE `gametype` =1;
DROP TEMPORARY TABLE `tmp2`;
CREATE TEMPORARY TABLE `tmp4` SELECT * FROM `tmp3` WHERE `promode` =0;
DROP TEMPORARY TABLE `tmp3`;
SELECT date( timestamp ) as date, min( time ), avg( time )
FROM `tmp4`
GROUP BY `date`
ORDER BY `date` ASC;
DROP TEMPORARY TABLE `tmp4`;
CREATE TEMPORARY TABLE `tmp1` SELECT * FROM `fastcap_200810heap` WHERE `player` = 'xsd|z1';group by と order by を分けた方がさらに早かったりして……なんて思ったけれど、この時点で結果が 2 件に絞られているので検証出来ず。
CREATE TEMPORARY TABLE `tmp2` SELECT * FROM `tmp1` WHERE `map` = 'q3wcp6';
DROP TEMPORARY TABLE `tmp1`;
CREATE TEMPORARY TABLE `tmp3` SELECT * FROM `tmp2` WHERE `gametype` =1;
DROP TEMPORARY TABLE `tmp2`;
CREATE TEMPORARY TABLE `tmp4` SELECT * FROM `tmp3` WHERE `promode` =0;
DROP TEMPORARY TABLE `tmp3`;
CREATE TEMPORARY TABLE `tmp5` SELECT date( timestamp ) as date, min( time ), avg( time ) FROM `tmp4` GROUP BY `date`;
DROP TEMPORARY TABLE `tmp4`;
SELECT * FROM `tmp5` ORDER BY `date` ASC;
DROP TEMPORARY TABLE `tmp5`;
それと stats の個別ページのように `player` = 'xsd|z1' のような固定条件を多用する場合、最初にこれをテンポラリにしておくだけで高速化出来るんだね。これは覚えないとな
追記
この方法を巨大テーブルに使うとメモリ内に収まらず、テンポラリテーブルが HDD に書き込まれることで逆に遅くなってしまった。使いどころが難しいなー
タグ:MySQL


