mysql 查询优化
不说话,先贴代码
public PageResult<BoTmcRaw> getLargeList(BaseCondition baseCondition) {
PageResult<BoTmcRaw> result=new PageResult<BoTmcRaw>();
Session session = this.getSessionFactory().getCurrentSession();
StringBuilder conditionStr=new StringBuilder();
conditionStr.append("");
if(baseCondition.getParamSql()!=null)conditionStr.append(baseCondition.getParamSql());
conditionStr.append(" order by "+baseCondition.getOrder()+" "+baseCondition.getSort());
conditionStr.append(" limit ");
conditionStr.append((Integer.parseInt(baseCondition
.getPage()) - 1)
* Integer.parseInt(baseCondition.getRows()));
conditionStr.append(",");
conditionStr.append(Integer.parseInt(baseCondition.getRows()));
String sql="select id from Bo_Tmc_Raw where 1=1 "+conditionStr.toString();
SQLQuery q = session.createSQLQuery(sql);
q.addScalar("id",Hibernate.LONG);
List<Long> ids = q.list();
String idstr="";
for(Long item:ids){
idstr=idstr+item+",";
}
if(ids.size()!=0)idstr=idstr.substring(0,idstr.length()-1);
sql="from BoTmcRaw where id in("+idstr+")";
Query ql = session.createQuery(sql);
result.setList(ql.list());
SQLQuery qc = session.createSQLQuery("select count(id) from bo_tmc_raw where 1=1 "+baseCondition.getParamSql());
result.setCount(((BigInteger)qc.uniqueResult()).intValue());
return result;
}
众所周知啊,mysql是轻量级的数据库,有很多功能是他不具备的。造句挺难的,别嫌我啰嗦,这个查询分页,其实很早我就注意到了,只是一直没有机会搞。
mysql是有查询分页功能的,limit这个关键字有人不知道,这个一点也不奇怪,但是当你认识他的时候,幸运的家伙会有好心人告诉你,这个不是真正的分页,mysql服务器还是会把所有的条目都遍历一遍,反正意思就是说,这个limit算法是有问题的,到底是不是这个好心人说的那样,我现在却有点怀疑了。
我们现在再来看看这个,
select * from ooo where id>=(select id from ooo limit 4523,1) limit 0,10;
写完sql加;是个好习惯。
但是。。算了;
这是我刚刚学习的一个语法,他的意思是说,limit算法的速度,取决于第一个参数的大小。第一个数,也就是开始位置越大,这个查询的时间就越长。这一点我刚刚证实是正确的,不做其他讨论。
依据这个语法,我们可以做出比直接使用limit更高效的查询,但是在实际应用中,这个直接拿来用很不好用。所以,这个只能做一个概念模型。
其实原理都是一样的,id作为索引,其查询效率非常高,用id做分页,然后分页得到的id用来做少量的全字段查询。我们要考虑的是,如果再加入排序,顺序倒序,其他字段排序,为什么一定要用大于号?sql里面现成的in关键字怎么不用?不要跟我说什么效率,你一页能显示多少数据?在一页数据中这个效率问题是可以忽略不计的。无论如何,比你手动10几20次查询快的多。也有人说用exists,这个语法只能用来关联查询,in是可以拼字符串的,显然比起两个表的关联查询,还是分开查比较好。
目前这个结果还算不错,大约70万条数据左右吧,第一页是瞬间就出来了,然而最后一页还是花了不少时间,可能用where比较好吧。别忘了加索引!索引!索引!重要的事情说三遍!加在id上就行。
mysql 查询优化的更多相关文章
- Atitit Mysql查询优化器 存取类型 范围存取类型 索引存取类型 AND or的分析
Atitit Mysql查询优化器 存取类型 范围存取类型 索引存取类型 AND or的分析 Atitit Mysql查询优化器 存取类型 范围存取类型 索引存取类型 AND or的分析1 存 ...
- MySQL查询优化之explain的深入解析
在分析查询性能时,考虑EXPLAIN关键字同样很管用.EXPLAIN关键字一般放在SELECT查询语句的前面,用于描述MySQL如何执行查询操作.以及MySQL成功返回结果集需要执行的行数.expla ...
- 1025WHERE执行顺序以及MySQL查询优化器
转自http://blog.csdn.net/zhanyan_x/article/details/25294539 -- WHERE执行顺序-- 过滤比较多的放在前面,然后更加容易匹配,从左到右进行执 ...
- MySQL查询优化:查询慢原因和解决技巧
在开发的朋友特别是和mysql有接触的朋友会碰到有时mysql查询很慢,当然我指的是大数据量百万千万级了,不是几十条了,下面我们来看看解决查询慢的办法. MySQL查询优化:查询慢原因和解决方法 会经 ...
- mysql查询优化器为什么可能会选择错误的执行计划
有可能导致mysql优化器选择错误的执行计划的原因如下: A:统计信息不准确,mysql依赖存储引擎为其提供的统计信息来评估成本,然而有的存储引擎提供的信息是准确的,有的引擎提供的可能就偏差很大,如: ...
- Mysql查询优化器
Mysql查询优化器 本文的目的主要是通过告诉大家,查询优化器为我们做了那些工作,我们怎么做,才能使查询优化器对我们的sql进行优化,以及启示我们sql语句怎么写,才能更有效率.那么到底mysql到底 ...
- MySQL查询优化 (一)
以下的文章主要讲述的是MySQL查询优化的5个十分好用方法,熟悉SQL语句的人都清楚,如果要对一个任务进行操作的话,SQL语句可以有很多种相关写法,但是不同的写法查询的性能可能会有天壤之别. 本文列举 ...
- MySQL查询优化:连接查询排序limit
MySQL查询优化:连接查询排序limit(join.order by.limit语句) 2013-02-27 个评论 收藏 我要投稿 MySQL查询优化:连接查询排序 ...
- MySQL查询优化之explain
在分析查询性能时,考虑EXPLAIN关键字同样很管用.EXPLAIN关键字一般放在SELECT查询语句的前面,用于描述MySQL如何执行查询操作.以及MySQL成功返回结果集需要执行的行数.expla ...
- Mysql查询优化器浅析
--Mysql查询优化器浅析 -----------------------------2014/06/11 1 定义 Mysql查询优化器的工作是为查询语句选择合适的执行路径.查询优化器的代码 ...
随机推荐
- freeMarker生成静态页面
项目结构图 footer.ftl des==>${f.des}<br/> <a href="http://www.baidu.com"> 百度 < ...
- MVC 使用 Ueditor富文本编辑器
一.Ueditor 1.下载Ueditor富文本编辑器 官方下载地址: http://ueditor.baidu.com/website/download.html 建议下载开发版,此处我下载的是 . ...
- guardian keytab生成不了
vim /var/kerberos/krb5kdc/kadm5.acl 将*e改成* /etc/init.d/kadmin restart 重启kadmin
- openssl evp RSA 加密解密
openssl evp RSA 加密解密 可以直接使用RSA.h 提供的接口 如下测试使用EVP提供的RSA接口 1. EVP提供的RSA 加密解密 主要接口: int EVP_PKEY_encryp ...
- python3 不同目录间模块调用
#Author by Andy #_*_ coding:utf-8 _*_ #__file__获取当前程序的相对路径 import os,sys #print(__file__) # os.path. ...
- ireport5.6+jasperreport6.3开发(二)--web开发的配置
ireport5.6只能编译出*.jasper的报表包,最终报表需要被输出为一个doc html pdf excel等文件,这时就需要jasperreport6.5的库进行配合了. jasperrep ...
- examine self thrice a day2017
1.6.2017 葰γí千萬丆γáò絠ィ壬菏鰯嚸,銣惈絠,倁噵ㄖㄅ者β淂簳掉.千澫丕楆被莂亽抓ィ主鰯點,以佌襲撃.那個記駐,吢軟劊嗐死尓垍己ㄖㄅ.絠仒槇可笑,鯟覀者βる誐手裏魢泾吺有談半リ的籌碼,還茬 ...
- AxureRP8实战手册(基础31-40)
AxureRP8实战手册(基础31-40) 本文目录 基础31. 切换元件库 第2章 页面设置 基础32. 设置页面居中 基础33. 设置页面背景(图片/颜色 ...
- Sprint2(12.6)
Sprint1第二阶段 1.类名:软件工程-第二阶段 方案一:此方案操作界面只有前台.厨房 (1)前台:用户到前台点餐,服务员操作界面,勾选客人所在桌号(不可重复勾选),并输入所选菜品,可增.删.改所 ...
- 【教程】16岁黑客如何把Windows 95装进智能手表?【转】
来自美国佐治亚州的16岁黑客Corbin Davenport十分喜欢摆弄电子产品,最近他刚到手了一台三星Gear Live,并开始把玩起来.他发现Android Wear作为Android系统的改版并 ...