ISUCON11予選参加記 (12位)

ISUCON11予選に チーム「焼肉ジャンボチキン」で参加して213593点で12位でした。

以下やったことを簡単にまとめます。 repository は https://github.com/ichyo/isucon11q です。

10~12時

create index isu_condition_jia_isu_uuid_timestamp_index
	on isu_condition (jia_isu_uuid asc, timestamp desc);
innodb_buffer_pool_size=2792M
innodb_log_file_size=512M
innodb_flush_method=O_DIRECT_NO_FSYNC

disable-log-bin # for isucon
innodb_flush_log_at_trx_commit=0 # for isucon
db.SetMaxOpenConns(128)
db.SetMaxIdleConns(128)
SELECT * FROM `isu_condition` WHERE `jia_isu_uuid` = ? ORDER BY timestamp DESC

が先頭行しか使われてないのでLIMIT 1 を加えた。

12時~14時

_, err = tx.NamedExec("INSERT INTO `isu_condition`"+
		"	(`jia_isu_uuid`, `timestamp`, `is_sitting`, `condition`, `message`)"+
		"	VALUES (:jia_isu_uuid, :timestamp, :is_sitting, :condition, :message)", conditions)

14時~16時

SELECT * FROM `isu_condition` WHERE `jia_isu_uuid` = ? AND `timestamp` < ? ORDER BY `timestamp` DESC

は全行読んだあとに conditionLevel でフィルターしたあとの limit 行だけ使っている。 テーブルにあらかじめ conditionLevel を入れることで WHERE condition_level IN (...)LIMIT ? をSQLに加えることができて速くなった。

16時~18時

SELECT * FROM `isu_condition` WHERE `jia_isu_uuid` = ? ORDER BY `timestamp` ASC

は全行読んだあとに1日分だけのデータを使っている。 WHERE ... AND timestamp >= ? AND timestamp <= ?graphDategraphDate.Add(24*time.Hour) を加えて高速化した。

やったけど効果がなかったこと

SELECT * FROM `isu_condition` WHERE `jia_isu_uuid` = ? ORDER BY timestamp DESC LIMIT 1

がループの中で呼ばれているので、1回で複数行取るようにしたが速くならなかった。

反省