2008年10月07日

[MySQLメモ] テンポラリテーブルで高速化

HEAP(Memory)テーブルの合計 3,000 件程度の小規模なデータを検索する場合でも複合検索を行うより分割した方が高速になるらしい。

SELECT date( timestamp ) as date, min( time ), avg( time )
FROM `fastcap_200810heap`
WHERE `player` = 'xsd|z1'
AND `map` = 'q3wcp6'
AND `gametype` =1
AND `promode` =0
GROUP BY `date`
ORDER BY `date` ASC;
where で使う全てのフィールドにはインデックスを付けているけど、この場合だと filesort が使われてしまい 0.0050 〜 0.0100 秒程かかる。

CREATE TEMPORARY TABLE `tmp1` SELECT * FROM `fastcap_200810heap` WHERE `player` = 'xsd|z1';
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;
しかしこうすると 0.0005 秒になる。HEAPテーブルなので全てメモリ内で完結出来るわけか。

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';
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`;
group by と order by を分けた方がさらに早かったりして……なんて思ったけれど、この時点で結果が 2 件に絞られているので検証出来ず。

それと stats の個別ページのように `player` = 'xsd|z1' のような固定条件を多用する場合、最初にこれをテンポラリにしておくだけで高速化出来るんだね。これは覚えないとな

追記
この方法を巨大テーブルに使うとメモリ内に収まらず、テンポラリテーブルが HDD に書き込まれることで逆に遅くなってしまった。使いどころが難しいなー
タグ:MySQL
posted by Bsan at 10:51| Comment(1) | TrackBack(0) | PCソフト関係 | このブログの読者になる | 更新情報をチェックする

2008年10月04日

目指せ旗取職人! FastCaps stats はじめました

FastCaps stats: http://fpsgamer.jp/fastcaps/

先日からこっそり建てているDefragのFastCaps ( 旗取りタイムアタック ) サーバーにお手製のstatsを導入しました。素人が作った手作り感あふれるスクリプトだけど、なんとか動いているので多分大丈夫だろう。このstatsに載せるには [FPSGAMER.JP Defrag FastCaps] サーバーで下記の設定で走ればok

/callvote promode 0 ( 0:vq3 1:cpm )
/callvote mode 2 or 3 ( 2:武器あり 3:武器なし )
/callvote map 好きなCTFマップ
( default promode 0, mode 2 )

さあ、みんなで #clan_xsd に挑戦だ!


Defrag
http://www.google.co.jp/search?source=ig&hl=ja&q=quake3+defrag

Defrag 1.91.08
http://fpsgamer.jp/fastcaps/defrag_1.91.08.zip
posted by Bsan at 07:26| Comment(0) | TrackBack(0) | Quake III Arena | このブログの読者になる | 更新情報をチェックする

2008年10月01日

Threewave VSP Stats 更新したよ

http://fpsgamer.jp/vsp/threewave_200810/

今日からこっちになります。データベースを移行したときから挙動不審な箇所がいくつか出来ていたけど、これで直ればいいのだけどな。しかし最近の盛り上がりにはびっくりしちゃうねー
posted by Bsan at 04:47| Comment(2) | TrackBack(0) | Quake III Arena | このブログの読者になる | 更新情報をチェックする