2017-02-15 50 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(),並在它的Makefile,它使用-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