IT技术网www.itjs.cn

当前位置:首页 > 数据库 > MySQL > 提高MySQL查询效率的三个技巧(1)

提高MySQL查询效率的三个技巧(1)

发布时间:2015-08-13 00:00 来源:未知

MySQL由于它本身的小巧和操作的高效,在数据库应用中越来越多的被采用。我在开发一个P2P应用的时候曾经使用MySQL来保存P2P节点,由于P2P的应用中,结点数动辄上万个,而且节点变化频繁,因此一定要保持查询和插入的高效。以下是我在使用过程中做的提高效率的三个有效的尝试。

使用statement进行绑定查询

使用statement可以提前构建查询语法树,在查询时不再需要构建语法树就直接查询。因此可以很好的提高查询的效率。这个方法适合于查询条件固定但查询非常频繁的场合。

使用方法是:

绑定,创建一个MYSQL_STMT变量,与对应的查询字符串绑定,字符串中的问号代表要传入的变量,每个问号都必须指定一个变量。

查询,输入每个指定的变量,传入MYSQL_STMT变量用可用的连接句柄执行。

代码如下:

//1.绑定

insertbind[1].buffer_type = MYSQL_TYPE_STRING;

insertbind[2].buffer_type = MYSQL_TYPE_TINY;

insertbind[3].buffer_type = MYSQL_TYPE_LONG;

insertbind[4].buffer_type = MYSQL_TYPE_SHORT;

insertbind[5].buffer_type = MYSQL_TYPE_LONG;

insertbind[6].buffer_type = MYSQL_TYPE_SHORT;

示例代码如下:

//1.常规的方法

//2.使用limit版

sprintf(selectSQL,"select count(*) from HostCache

where ChannelID = '%s' and ISPtype = %d", channelid, ISPtype);

//使用limit作查询

设计代码如下:

//定义句柄队列

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

//创建两个队列

//所有的连接句柄先连上数据库,加入到空闲队列中,等待使用.

//提取一个空闲句柄供使用

return pConnectHandle;

//从使用队列中释放一个使用完毕的句柄,插入到空闲队列

MySQL由于它本身的小巧和操作的高效,在数据库应用中越来越多的被采用。我在开发一个P2P应用的时候曾经使用MySQL来保存P2P节点,由于P2P的应用中,结点数动辄上万个,而且节点变化频繁,因此一定要保持查询和插入的高效。以下是我在使用过程中做的提高效率的三个有效的尝试。

使用statement进行绑定查询

使用statement可以提前构建查询语法树,在查询时不再需要构建语法树就直接查询。因此可以很好的提高查询的效率。这个方法适合于查询条件固定但查询非常频繁的场合。

使用方法是:

绑定,创建一个MYSQL_STMT变量,与对应的查询字符串绑定,字符串中的问号代表要传入的变量,每个问号都必须指定一个变量。

查询,输入每个指定的变量,传入MYSQL_STMT变量用可用的连接句柄执行。

代码如下:

//1.绑定

insertbind[1].buffer_type = MYSQL_TYPE_STRING;

insertbind[2].buffer_type = MYSQL_TYPE_TINY;

insertbind[3].buffer_type = MYSQL_TYPE_LONG;

insertbind[4].buffer_type = MYSQL_TYPE_SHORT;

insertbind[5].buffer_type = MYSQL_TYPE_LONG;

insertbind[6].buffer_type = MYSQL_TYPE_SHORT;

//2.使用limit版

sprintf(selectSQL,"select count(*) from HostCache

where ChannelID = '%s' and ISPtype = %d", channelid, ISPtype);

//使用limit作查询

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

//创建两个队列

//所有的连接句柄先连上数据库,加入到空闲队列中,等待使用.

//提取一个空闲句柄供使用

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;

}