MySQL 查询中的分页思绪的优化[MySQL防范]
本文“MySQL 查询中的分页思绪的优化[MySQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
复杂条件搜索时,where somthing order by somefield+somefieldMySQL会搜遍数据库,找出"全部"符合条件的记录,然后取出m,n条记录.假如你的数据量有几十万条,用户又搜索一些很通俗的词,然后要顺次读最后几页重温旧梦.mysql该很悲壮的不断操作硬盘.
所以,可以试着让mysql也存储分页,当然要程序配合.
ASP的分页:在ASP系统中有Recordset对象来实现分页,但是大量数据放在内存中,并且不知道什么时刻才失效(请ASP高手指导). SQL数据库分页:用存储历程+游标方法分页,具体实现原理不是很清楚,假想假如用一次查询就得到需求的后果,大概是id集,需求后续页时只要按照后果中的IDs读出相关记录.这样只要很小的空间保存本次查询的全部IDs. (SQL中的查询后果不知道怎样清楚过期垃圾?)
这样,可以让mysql模拟存储分页机制:1. select id from $table where $condition order by $field limit $max_pages*$count;查询符合条件的IDs.限定最大符合条件的记录数目,也可以不加.2. 因为PHP在履行完毕后全部变量都要lost,所以可以考虑:筹划a. 在mysql成立暂时表,查询后果用一个时间或随机数作为唯一标志插入.此中成立page1~pagen个字段,每个字段保存该页中需求的ids, 这样一个id对一条记录.筹划b. 假如翻开session,也可以放在session中保存,实际上是放在文件中保存.成立一个$IDs数组,$IDs[1]~$IDs[$max_pages]. 考虑到有时刻用户会开几个窗口同时查询,要为$ids做一个唯一标志,避免查询后果彼此覆盖.二维数组和$$var都是好办法.3. 在每页页的恳求中,直接找到对应的IDs,中间以","隔断:select * from $table where id in ($ids); 速度绝对快4. 收尾要考虑查询后果的自动排除,可以设置按时大概按比例随机清楚.假如用mysql暂时表要加上一个时间标志字段,session中要加入$IDs["time"]=time(); 在一按时间今后不操作视为过期数据.
假如要优化,可以考虑用把1和2.a中的语句归并成select ...... into ....
以上是“MySQL 查询中的分页思绪的优化[MySQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:本文地址: | 与您的QQ/BBS好友分享! |