我正在做一个实验,通过多线程将数据同时插入mysql表。
下面是c++中的部分代码。
bool query_thread(const char* cmd, MYSQL* con) {
if( !query( cmd, con ) ) {
return 0;
}
return 1;
}
int main() {
........
if(mysql_query(m_con, "CREATE TABLE tb1 (model INT(32), handle INT(32))") != 0) {
return 0;
}
thread thread1(query_thread, "INSERT INTO tb1 VALUES (1,1)", m_con);
thread thread2(query_thread, "INSERT INTO tb1 VALUES (2,2)", m_con);
thread thread3(query_thread, "INSERT INTO tb1 VALUES (3,3)", m_con);
thread1.join();
thread2.join();
thread3.join();
}
但是mysql错误消息已经发出。
error cmd:插入tb1值(1,1)
查询期间与mysql服务器失去连接
分段故障
我的问题如下。
是因为mysql不能同时接受插入吗?或者多线程使用不当。
通过如上所述的多线程插入,是否有助于加速程序?我知道最好的方法是每个查询多个插入和加载数据填充。但我只想知道这种方法是否有用。
1条答案
按热度按时间lyr7nygr1#
每个线程必须具有:
自己的数据库连接
自有交易
自己的光标
但是,这不会使插入速度快得多。简而言之,innodb日志(journal)本质上是串行的,这限制了服务器的总插入速率。阅读mysql性能博客(percona/mariadb)了解详细信息。当然,有一些参数需要调整,而且最近似乎有了一些进展。