2017-02-15 10 views
0

最近暗号化システムを高速化したいと思います。このシステムでは、mysqlを使用するので、ファイルには<mysql.h>が含まれています。mysql_query()が遅いです

そして、私はシステムが暗号化/復号化のためではなく、いくつかのSQL文を処理するために低速で動作することを発見しました。

ランニング時にメモリデータベースを使用し、<mysql.h>のmysql_query()を使用してデータベースにクエリを発行します。クエリは次のように、非常に簡単です:上記のクエリのよう

UPDATE embedded_db.generic_prefix_staleness SET stale = FALSE WHERE cache_id = 2165265089 

、約28.42ミリを過ごすことになり、それはあまりにも遅いですし、私はその理由を見つけることができません。 どうすれば修正できますか?私はいくつかの設定を追加/変更すべきか、何か他のことをするべきですか?

と一時データベース情報:

void 
Connect::do_connect(const std::string &server, const std::string &user, 
       const std::string &passwd, uint port) 
{ 
    const char *dummy_argv[] = { 
     "progname", 
     "--skip-grant-tables", 
     "--skip-innodb", 
     "--default-storage-engine=MEMORY", 
     "--character-set-server=utf8", 
     "--language=" MYSQL_BUILD_DIR "/sql/share/" 
    }; 
    assert(0 == mysql_library_init(sizeof(dummy_argv)/sizeof(*dummy_argv), 
           const_cast<char**>(dummy_argv), 0)); 

    conn = mysql_init(NULL); 

    /* Connect via TCP, and not via Unix domain sockets */ 
    const uint proto = MYSQL_PROTOCOL_TCP; 
    mysql_options(conn, MYSQL_OPT_PROTOCOL, &proto); 

    /* Connect to real server even if linked against embedded libmysqld */ 
    mysql_options(conn, MYSQL_OPT_USE_REMOTE_CONNECTION, 0); 

    { 
     my_bool reconnect = 1; 
     /* automatically reconnect */ 
     mysql_options(conn, MYSQL_OPT_RECONNECT, &reconnect); 
    } 

    /* Connect to database */ 
    if (!mysql_real_connect(conn, server.c_str(), user.c_str(), 
         passwd.c_str(), 0, port, 0, 
         CLIENT_MULTI_STATEMENTS)) { 
     LOG(warn) << "connecting to server " << server 
       << " user " << user 
       << " pwd " << passwd 
       << " port " << port; 
     LOG(warn) << "mysql_real_connect: " << mysql_error(conn); 
     throw std::runtime_error("cannot connect"); 
    } 
} 

アップデート1:

私はそれが機能mysql_library_init()を使うことに気づいた、そしてそれはメイクファイルがあります、それはを使用するので、それは、-L$(MYBUILD)/libmysqldを使用組み込みMySQLサーバ。埋め込みMySQLサーバの設定を編集する必要がありますか?

+0

私はそれが含まれ、これはDBスキーマを見たりroughtly知らなくても答えることは本当に可能だとは思いません。しかし、明確にするために、cache_id列にインデックスがあります。 – MrEricSir

+0

generic_prefix_stalenessのスキーマは次のようなものです: 'CREATE TABLE IF NOT EXISTS embedded_db.generic_prefix_staleness(cache_id BIGINT UNIQUE NOT NULL、古いBOOLEAN NOT NULL、ID SERIAL PRIMARY KEY)ENGINE = InnoDB;'、おそらくインデックスがありません... – user2655973

答えて

0

これは、埋め込まれたサーバーを使用するので、私たちは次のようにmy.cnfにいくつかの設定を追加する必要があります。

[embedded] 
innodb_flush_log_at_trx_commit = 0 
関連する問題