show fullprocess を見ると、多くのinsertがsleepになっているのですが、
これは1DBあたりのクエリ受付可能数(?)がキャパシティを超えているからでしょうか?
insert を並列実行できないのでは?
たとえば、一意制限のあるカラムがあれば、並列実行は不可能ですよね。
インデックスの更新も並列実行できないものと思われます。
一意制限もインデックスも無いとしても、トランザクションの分離レベルを
さげないと並列実行は許されないような気がします。
ちなみにバルクインサートはしていますが、そもそもDBにアクセスしている端末数が多い為、このような状態になっているのかもしれません。
- 端末からの要求を受けたスレッドはinsert要求をキューに詰める(何番目の要求かを示す番号をもらって待つ)
- 別のスレッドでキューから一定量ずつ取り出してバルクインサートする
- インサートが終わったら何番目まで進んだかをアナウンスする
- 待っていたスレッドはアナウンスされた番号が自分の番号より大きければ、成功を返す
というようなことをすれば速度は上がるかもしれません。スレッドが重い処理系で上記のようなことをやると、大量のメモリが必要になったり、遅くなったりするかもしれません。Javascriptとか Go とか c10k対応の処理系でないと厳しいかもしれません。しかし、今大量に Sleep になっても耐えられているのであれば、大丈夫かも。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。