mysql_query() 很慢

Posted

技术标签:

【中文标题】mysql_query() 很慢【英文标题】:The mysql_query() is slow 【发布时间】:2017-02-15 04:58:57 【问题描述】:

我最近想加速一个加密系统。而在这个系统中,它会使用mysql,所以它包含<mysql.h>文件。

我发现系统运行缓慢不是因为加密/解密,而是因为处理了一些sql语句。

它将在运行期间使用内存数据库,并使用来自<mysql.h> 的mysql_query() 向数据库发出一些查询。查询很简单,比如:

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

和上面的查询一样,大概需要28.42 ms,太慢了,找不到原因。 那么我该如何解决呢?我应该添加/修改一些配置还是做其他事情?

以及临时数据库信息:

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 服务器编辑一些配置?

【问题讨论】:

我认为如果不查看数据库架构或粗略知道它包含的内容,这真的不可能回答。但为了清楚起见,cache_id 列上有一个索引,对吧? generic_prefix_staleness 的schema类似于:CREATE TABLE IF NOT EXISTS embedded_db.generic_prefix_staleness (cache_id BIGINT UNIQUE NOT NULL, stale BOOLEAN NOT NULL, id SERIAL PRIMARY KEY) ENGINE=InnoDB;,可能没有索引... 你想达到什么目的,连接到带有嵌入式库的删除服务器? 【参考方案1】:

它使用嵌入式服务器,所以我们需要在my.cnf 中添加一些配置,例如:

[embedded]
innodb_flush_log_at_trx_commit = 0

【讨论】:

以上是关于mysql_query() 很慢的主要内容,如果未能解决你的问题,请参考以下文章

SAP migo这个事物代码在做操作的时候,多人操作同一个事务代码时很慢很慢,是啥原因?

jsp做的网页,用tomcat测试时读数据库数据时很慢很慢,是啥原因?

公司网络很慢很卡的原因分析与处理

数据结构

selenium 脚本驱动chrome浏览器很慢

macbookpro14寸装虚拟系统反应很慢