MySQL ストレージエンジンに直接アクセスするストアドプロシージャ
詳細な説明はこっち: Kazuho@Cybozu Labs: MySQL (InnoDB) に直接アクセスしてタイムライン処理を高速化する話
コードはこっち: http://coderepos.org/share/browser/lang/sql/mysql_timeline
ストアドプロシージャっつーか、ぶっちゃけ UDF なんですが。
とりあえず動くようになった。1行1カラムコピーするコードは、こんな感じで書ける。
struct test_native_t : private mysql_direct_access<test_native_t> { int add_tables() { register_table("test", "message", TL_READ); register_table("test", "t", TL_WRITE_CONCURRENT_INSERT); return 0; } int run() { TABLE *cq = get_table(0); TABLE *t = get_table(1); /* setup */ cq->use_all_columns(); cq->file->info(HA_STATUS_VARIABLE); cq->file->ha_rnd_init(1); t->use_all_columns(); t->file->info(HA_STATUS_VARIABLE); /* copy */ cq->file->rnd_next(cq->record[0]); memset(t->record[0], 0, t->s->null_bytes); t->field[0]->store(cq->field[0]->val_int(), true); t->file->ha_write_row(t->record[0]); /* cleanup */ cq->file->ha_rnd_end(); return 0; } };
呼出はこんな感じ。
mysql> select test_native();