c++ - 如何使用 MySQL 将 c++ for 循环代码加速到查询中

标签 c++ mysql sql

c++子函数代码

插入数据到MySQL

bool mysqlinsert2(int sourceindex,int targetindex,string source,string target)
    {
        MYSQL *conn_ptr;
        conn_ptr = mysql_init(NULL);

        if(!conn_ptr)
        {
            fprintf(stderr,"mysql_init failed\n");
            //return EXIT_FAILURE;
        }

        conn_ptr = mysql_real_connect(conn_ptr,"localhost","root","nlpgroup","testdb",0,NULL,0);

        if(conn_ptr)
        {
            int abc;
            char sql_buffer[500] = {0};
            sprintf(sql_buffer,"insert into EM2 (sourceindex,targetindex,source,target) values(\"%d\",\"%d\",\"%s\",\"%s\")",sourceindex,targetindex,source.c_str(),target.c_str());
            if((abc = mysql_query(conn_ptr,sql_buffer)))
            {
                printf("error code:%s\n",mysql_error(conn_ptr));
            }
            mysql_close(conn_ptr);
            return true;
            //connection succees
        }
        else
        {
            printf("Error code: %d  %s %s\n",mysql_errno(conn_ptr),mysql_sqlstate(conn_ptr),mysql_error(conn_ptr));
            mysql_close(conn_ptr);
            return false;
            //return EXIT_SUCCESS;
        }
    }

run loop代码,调用函数mysqlinsert2将for循环索引和值输入MySQL

void write_token_to_data()
    {
        typedef double* DynamicMatrix[l+m];
        // DynamicMatrix Count;
        typedef double* DynamicMatrix2[l+m];
        //DynamicMatrix2 Prob;
        for(int i=0; i<(l+m); i++)
        {
            for(int j=0; j<(l+m); j++)
            {
                if(mysqlinsert2(i,j,combine[i],combine[j]))
                {
                    cout<<"insert OK!!"<<endl;
                }
                else
                {
                    cout<<"insert failed"<<endl;
                }


            }
        }
        
    }//end of function

当 MySQL insert ok 时,程序将返回“insert ok!!” 所以,这是我的问题

这些查询可能会达到 30000*30000 次 我想知道如何加速这个,也许我可以优化 MySQL 设置或更改 c++ 中的代码,我希望它有相同的结果

最佳答案

您可以进行的几项改进:

  1. 将这两个函数放在一个类中,将 MYSQL *conn_ptr 保留为该类的成员字段。然后你的 mysqlinsert2 函数不需要每次都创建和销毁连接。

    class MyInserter {
    public:
      MyInserter() {
        conn_ptr = mysql_init(NULL);
        if (!conn_ptr) throw ...;
        conn_ptr = mysql_real_connect(conn_ptr, ...);
        if (!conn_ptr) throw ...;
      }
      ~MyInserter() {
        mysql_close(conn_ptr);
      }
      bool mysqlinsert2(...) { ... }
      void write_token_to_data() { ... }
    
    private:
      MYSQL *conn_ptr;
    }
    
  2. 使用 prepared statementsbound parameters .这不仅会加快您的查询速度,还会防止 SQL 注入(inject)攻击(即有人在您插入的字符串中放置引号字符)。

  3. 考虑使用 std::ostringstream,而不是使用 char sql_buffer[500]sprintf。这避免了缓冲区溢出并且可以使代码更具可读性。请注意,如果您也执行上面的 (2),下面的代码将会更改:

    std::ostringstream out;
    out << "insert into EM2 (sourceindex,targetindex,source,target) values(\"" << sourceindex << "\",\"" << targetindex << "\",\"" << source << "\",\"" << target << "\")"";
    std::string sql_string = out.str();
    ... mysql_query(conn_ptr, sql_string.c_str()) ...
    

关于c++ - 如何使用 MySQL 将 c++ for 循环代码加速到查询中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26113704/

相关文章:

c++ - 从 C++ 访问 ListElement (QML) 颜色

c++ - 使用 fstream 对象将文件中的信息存储到变量中

php - mysql php 脚本 : add credits after paypal process

mysql - 具有多个最终用户的 SQL 数据库体系结构

java - 将sql数据库和oracle数据库链接到一个SELECT查询语句中

c++ - 虚拟类作为具有 Spirit 的 AST 节点

c++ - 整数类包装器性能

php - SQL 计算具有相同 sub_id 的两个值的百分比。

php - MySQL 内部连接更新

mysql - SQL from inside in 影响连接结果