关于提高MySQL查询效率的三个页面1/2
l使用语句进行绑定查询
使用语句可以提前建立查询语法树,不需查询就能直接查询。它能很好地提高查询效率。该方法适用于查询条件固定但查询频繁的场合。
使用方法是:
结合,创造一个mysql_stmt变量绑定到相应的查询字符串,字符串中的问号代表要输入的变量,每个问号必须指定一个变量。
查询,输入每一个指定的变量,和传入的mysql_stmt变量执行可用的连接处理。
代码如下:
1。结合
布尔cdbmanager::BindInsertStmt(mysql * connecthandle)
{
使插入操作绑定
mysql_bind insertbind { feild_num };
如果(m_stinsertparam = null)
m_stinsertparam =新chostcachetable;
m_stinsertstmt = mysql_stmt_init(connecthandle);
构建/绑定字符串
insertsql sql_length } { char;
Strcpy(insertsql,插入hostcache(SessionID,channelid,ISPType,)
externalip,ExternalPort,internalip,internalport)。
值(,);
mysql_stmt_prepare(m_stinsertstmt,insertsql,strlen(insertsql));
国际param_count = mysql_stmt_param_count(m_stinsertstmt);
如果(param_count!= feild_num)
返回false;
结合/ m_sinsertparam充满结构数组,声明结构变量的关系
memset(insertbind,0,sizeof(insertbind));
insertbind { 0 }。buffer_type = mysql_type_string;
insertbind { 0 }。buffer_length = id_length 1 / * * /;
insertbind { 0 }。缓冲=(char *)m_stinsertparam -> SessionID;
insertbind { 0 }。is_null = 0;
insertbind { 0 }。长度= 0;
insertbind { 1 }。buffer_type = mysql_type_string;
insertbind { 1 }。buffer_length = id_length 1 / * * /;
insertbind { 1 }。缓冲=(char *)m_stinsertparam -> channelid;
insertbind { 1 }。is_null = 0;
insertbind { 1 }。长度= 0;
insertbind { 2 }。buffer_type = mysql_type_tiny;
insertbind { 2 }。缓冲=(char *)m_stinsertparam -> isptype;
insertbind { 2 }。is_null = 0;
insertbind { 2 }。长度= 0;
insertbind { 3 }。buffer_type = mysql_type_long;
insertbind { 3 }。缓冲=(char *)m_stinsertparam -> externalip;
insertbind { 3 }。is_null = 0;
insertbind { 3 }。长度= 0;
insertbind { 4 }。buffer_type = mysql_type_short;
insertbind { 4 }。缓冲=(char *)m_stinsertparam -> externalport;
insertbind { 4 }。is_null = 0;
insertbind { 4 }。长度= 0;
insertbind { 5 }。buffer_type = mysql_type_long;
insertbind { 5 }。缓冲=(char *)m_stinsertparam -> internalip;
insertbind { 5 }。is_null = 0;
insertbind { 5 }。长度= 0;
insertbind { 6 }。buffer_type = mysql_type_short;
insertbind { 6 }。缓冲=(char *)m_stinsertparam -> internalport;
insertbind { 6 }。is_null = 0;
insertbind { 6 }。is_null = 0;
绑定
如果(mysql_stmt_bind_param(m_stinsertstmt,insertbind))
返回false;
返回true;
}
2。查询
布尔cdbmanager::inserthostcache2(mysql * connecthandle,char * channelid SessionID,char *,int ISPtype,
unsigned int型、无符号短整型,短整型,IIP,iPORT)
{
/ /填充结构变量m_sinsertparam
Strcpy(m_stinsertparam -> SessionID,SessionID);
Strcpy(m_stinsertparam -> channelid,channelid);
m_stinsertparam -> isptype = isptype;
m_stinsertparam -> externalip = EIP;
m_stinsertparam -> externalport =报;
m_stinsertparam -> internalip = IIP;
m_stinsertparam -> internalport = iPORT;
执行语句,性能瓶颈
如果(mysql_stmt_execute(m_stinsertstmt))
返回false;
返回true;
}
随机存取记录
在一些数据库应用程序中,我们不需要获得满足需求的所有记录,但是我们需要随机地记录满足需求的记录。这种情况在数据服务的统计分析和从大容量数据库中获取少量数据时很常见。
有两种方法可以做。
1、传统方法首先查询满足要求的所有记录,然后随机选取一些记录。当多个记录满足时,该方法不能达到理想的结果。
2、使用限制语法,我们首先得到满足需求的记录数量,然后在SQL查询中添加限制,以限制查询以满足所需记录。虽然这种方法需要两次查询,但当数据量较大时,它更有效。
示例代码如下所示:
传统的方法1。
/ /性能瓶颈,10万条记录,查询140ms的,得到的结果集时,其余的可以忽略
Int CDBManager::queryhostcache(mysql * connecthandle,char * channelid,int ISPtype,cdbmanager::chostcachetable * hostcache)
{
焦sql_length递给李四{ };
memset(递给李四,0,sizeof(递给李四));
sprintf(递给李四,选择*从hostcache哪里channelid =% s isptype = %d
如果(mysql_real_query(connecthandle,递给李四,strlen(递给李四))!= 0)检索
返回0;
获取/设置
m_presultset = mysql_store_result(connecthandle);
如果(m_presultset!)获取结果集。
返回0;
int = iallnumrows(int)(mysql_num_rows(m_presultset) / / / <);所有的搜索结果数
计算返回的结果数。
int = ireturnnumrows(iallnumrows <= return_query_host_num iallnumrows:return_query_host_num);
如果(ireturnnumrows return_query_host_num)
{
得到/逐项列出
为(int i = 0;i < ireturnnumrows;i++)
{
一个接一个地获取
m_row = mysql_fetch_row(m_presultset);
如果(m_row { 0 }!= null)
Strcpy(hostcache {我}。SessionID,m_row { 0 });
如果(m_row { 1 }!= null)
Strcpy(hostcache {我}。channelid,m_row { 1 });
如果(m_row { 2 }!= null)
hostcache {我}。isptype = atoi(m_row { 2 });
如果(m_row { 3 }!= null)
hostcache {我}。externalip = atoi(m_row { 3 });
If (m_Row{4}! = null)
hostcache {我}。externalport = atoi(m_row { 4 });
如果(m_row { 5 }!= null)
hostcache {我}。internalip = atoi(m_row { 5 });
如果(m_row { 6 }!= null)
hostcache {我}。internalport = atoi(m_row { 6 });
}
}
其他的
{
随机选择指定的返回记录
国际iremainder = iallnumrows % ireturnnumrows; / / / <剩余
国际iquotient = iallnumrows / / / ireturnnumrows; / <
国际istartindex =兰特(%)(iremainder + 1); / / / <开始。
得到/逐项列出
为(int iselectedindex = 0;iselectedindex < ireturnnumrows;iselectedindex + +)
{
mysql_data_seek(m_presultset,istartindex + iquotient * iselectedindex);
m_row = mysql_fetch_row(m_presultset);
如果(m_row { 0 }!= null)
Strcpy(hostcache { iselectedindex }。SessionID,m_row { 0 });
如果(m_row { 1 }!= null)
Strcpy(hostcache { iselectedindex }。channelid,m_row { 1 });
如果(m_row { 2 }!= null)
iselectedindex hostcache { }。isptype = atoi(m_row { 2 });
如果(m_row { 3 }!= null)
iselectedindex hostcache { }。externalip = atoi(m_row { 3 });
如果(m_row { 4 }!= null)
iselectedindex hostcache { }。externalport = atoi(m_row { 4 });
如果(m_row { 5 }!= null)
iselectedindex hostcache { }。internalip = atoi(m_row { 5 });
如果(m_row { 6 }!= null)
iselectedindex hostcache { }。internalport = atoi(m_row { 6 });
}
}
结果集/内容的释放
mysql_free_result(m_presultset);
返回ireturnnumrows;
}