mysql数据库查询优化 mysql效率第3/3页

 更新时间:2008年01月02日 18:55:37   作者:  
MySQL由于它本身的小巧和操作的高效, 在数据库应用中越来越多的被采用.我在开发一个P2P应用的时候曾经使用MySQL来保存P2P节点,由于P2P的应用中,结点数动辄上万个,而且节点变化频繁,因此一定要保持查询和插入的高效.以下是我在使用过程中做的提高效率的三个有效的尝试. 1. 使用statement进行绑定查询 2. 随机的获取记录 3. 使用连接池管理连接.

  使用连接池管理连接.
在有大量节点访问的数据库设计中,经常要使用到连接池来管理所有的连接.
一般方法是:建立两个连接句柄队列,空闲的等待使用的队列和正在使用的队列.
当要查询时先从空闲队列中获取一个句柄,插入到正在使用的队列,再用这个句柄做数据库操作,完毕后一定要从使用队列中删除,再插入到空闲队列.
设计代码如下: 

复制代码 代码如下:

//定义句柄队列 
typedef std::list<MYSQL *> CONNECTION_HANDLE_LIST; 
typedef std::list<MYSQL *>::iterator CONNECTION_HANDLE_LIST_IT; 

//连接数据库的参数结构 
class CDBParameter              

public: 
       char *host;                                 ///<主机名 
       char *user;                                 ///<用户名 
       char *password;                         ///<密码 
       char *database;                           ///<数据库名 
       unsigned int port;                 ///<端口,一般为0 
       const char *unix_socket;      ///<套接字,一般为NULL 
       unsigned int client_flag; ///<一般为0 
}; 

//创建两个队列 
CONNECTION_HANDLE_LIST m_lsBusyList;                ///<正在使用的连接句柄 
CONNECTION_HANDLE_LIST m_lsIdleList;                  ///<未使用的连接句柄 

//所有的连接句柄先连上数据库,加入到空闲队列中,等待使用. 
bool CDBManager::Connect(char * host /* = "localhost" */, char * user /* = "chenmin" */, \ 
                                           char * password /* = "chenmin" */, char * database /* = "HostCache" */) 

       CDBParameter * lpDBParam = new CDBParameter(); 
       lpDBParam->host = host; 
       lpDBParam->user = user; 
       lpDBParam->password = password; 
       lpDBParam->database = database; 
       lpDBParam->port = 0; 
       lpDBParam->unix_socket = NULL; 
       lpDBParam->client_flag = 0; 
       try 
       { 
              //连接 
              for(int index = 0; index < CONNECTION_NUM; index++) 
              { 
                     MYSQL * pConnectHandle = mysql_init((MYSQL*) 0);     //初始化连接句柄 
                     if(!mysql_real_connect(pConnectHandle, lpDBParam->host, lpDBParam->user, lpDBParam->password,\ 
       lpDBParam->database,lpDBParam->port,lpDBParam->unix_socket,lpDBParam->client_fla)) 
                            return false; 
//加入到空闲队列中 
                     m_lsIdleList.push_back(pConnectHandle); 
              } 
       } 
       catch(...) 
       { 
              return false; 
       } 
       return true; 


//提取一个空闲句柄供使用 
MYSQL * CDBManager::GetIdleConnectHandle() 

       MYSQL * pConnectHandle = NULL; 
       m_ListMutex.acquire(); 
       if(m_lsIdleList.size()) 
       { 
              pConnectHandle = m_lsIdleList.front();        
              m_lsIdleList.pop_front(); 
              m_lsBusyList.push_back(pConnectHandle); 
       } 
       else //特殊情况,闲队列中为空,返回为空 
       { 
              pConnectHandle = 0; 
       } 
       m_ListMutex.release(); 

       return pConnectHandle; 


//从使用队列中释放一个使用完毕的句柄,插入到空闲队列 
void CDBManager::SetIdleConnectHandle(MYSQL * connecthandle) 

       m_ListMutex.acquire(); 
       m_lsBusyList.remove(connecthandle); 
       m_lsIdleList.push_back(connecthandle); 
       m_ListMutex.release(); 

//使用示例,首先获取空闲句柄,利用这个句柄做真正的操作,然后再插回到空闲队列 
bool CDBManager::DeleteHostCacheBySessionID(char * sessionid) 

       MYSQL * pConnectHandle = GetIdleConnectHandle(); 
       if(!pConnectHandle) 
              return 0; 
       bool bRet = DeleteHostCacheBySessionID(pConnectHandle, sessionid); 
       SetIdleConnectHandle(pConnectHandle); 
       return bRet; 

//传入空闲的句柄,做真正的删除操作 
bool CDBManager::DeleteHostCacheBySessionID(MYSQL * connecthandle, char * sessionid) 

       char deleteSQL[SQL_LENGTH]; 
       memset(deleteSQL, 0, sizeof(deleteSQL)); 
       sprintf(deleteSQL,"delete from HostCache where SessionID = '%s'", sessionid); 
       if(mysql_query(connecthandle,deleteSQL) != 0) //删除 
              return false; 
       return true; 

相关文章

  • SQL实现LeetCode(196.删除重复邮箱)

    SQL实现LeetCode(196.删除重复邮箱)

    这篇文章主要介绍了SQL实现LeetCode(196.删除重复邮箱),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • mysql 按中文字段排序

    mysql 按中文字段排序

    在MySQL中,进行中文排序和查找的时候,对汉字的排序和查找结果是错误的。 这种情况在MySQL的很多版本中都存在。
    2009-01-01
  • Mysql BinLog存储机制与数据恢复方式

    Mysql BinLog存储机制与数据恢复方式

    这篇文章主要介绍了Mysql BinLog存储机制与数据恢复方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • MYSQL Left Join优化(10秒优化到20毫秒内)

    MYSQL Left Join优化(10秒优化到20毫秒内)

    在实际开发中,相信大多数人都会用到join进行连表查询,但是有些人发现,用join好像效率很低,而且驱动表不同,执行时间也不同。那么join到底是如何执行的呢,本文就详细的介绍一下
    2021-12-12
  • 同时运行多个MySQL服务器的方法

    同时运行多个MySQL服务器的方法

    在同一台机器上运行多个有些情况下你可能想要在同一台机器上运行多个服务器。例如,你可能想要测试一个新的MySQL版本而让你现有生产系统的设置不受到干扰, 或你可能是想要为不同的客户提供独立的MySQL安装一个因特网服务供应商。
    2008-05-05
  • Mysql字符集utf8和utf8mb4详解

    Mysql字符集utf8和utf8mb4详解

    文章介绍了MySQL中utf8和utf8mb4两种字符集的区别,包括编码方式、存储空间、索引长度以及支持的Unicode字符范围,同时,通过创建两个表并插入数据进行存储长度的比较,验证了上述理论
    2024-12-12
  • Mysql下自动删除指定时间以前的记录的操作方法

    Mysql下自动删除指定时间以前的记录的操作方法

    这篇文章主要介绍了MySQL下自动删除指定时间以前的记录的操作方法,需要的朋友可以参考下
    2018-08-08
  • 利用JuiceFS使MySQL 备份验证性能提升 10 倍

    利用JuiceFS使MySQL 备份验证性能提升 10 倍

    这篇文章主要介绍了如何让 MySQL 备份验证性能提升 10 倍,JuiceFS 非常适合用来做 MySQL 物理备份,通过不断调整 XtraBackup 的参数和 JuiceFS 的挂载参数,在一个小时内将时间缩短到原先的 1/10,下文一起来看相关内容的详细介绍吧
    2022-03-03
  • mysql分表和分区的区别浅析

    mysql分表和分区的区别浅析

    这篇文章主要介绍了mysql分表和分区的区别浅析,并对它们之间的相同做了分析,需要的朋友可以参考下
    2014-07-07
  • 一文深入探讨MySQL是如何解决幻读问题

    一文深入探讨MySQL是如何解决幻读问题

    SQL标准中定义了4种隔离级别,分别是读未提交、读已提交、可重复读以及序列化。不同的隔离级别下,本文将重点探讨下MySQL是如何解决幻读问题的,需要的朋友可以跟着小编一起来探讨一下
    2023-07-07

最新评论