




全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
SELECT*FROMtableLIMIToffset,rows|rowsOFFSEToffset mysqlSELECT*FROMtableLIMIT5,10;/检索记录行6-15/为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为-1:mysqlSELECT*FROMtableLIMIT95,-1;/检索记录行96-last./如果只给定一个参数,它表示返回最大的记录行数目:mysqlSELECT*FROMtableLIMIT5;/检索前5个记录行/换句话说,LIMITn等价于LIMIT0,n。select * from table LIMIT 5,10; #返回第6-15行数据select * from table LIMIT 5; #返回前5行select * from table LIMIT 0,5; #返回前5行1、offset比较小的时候。select * from yanxue8_visit limit 10,10多次运行,时间保持在0.0004-0.0005之间Select * From yanxue8_visit Where vid =(Select vid From yanxue8_visit Order By vid limit 10,1) limit 10多次运行,时间保持在0.0005-0.0006之间,主要是0.0006结论:偏移offset较小的时候,直接使用limit较优。这个显然是子查询的原因。2、offset大的时候。select * from yanxue8_visit limit 10000,10多次运行,时间保持在0.0187左右Select * From yanxue8_visit Where vid =(Select vid From yanxue8_visit Order By vid limit 10000,1) limit 10多次运行,时间保持在0.0061左右,只有前者的1/3。可以预计offset越大,后者越优。性能优化:基于MySQL5.0中limit的高性能,我对数据分页也重新有了新的认识.1.Select * From cyclopedia Where ID=(Select Max(ID) From (Select ID From cyclopedia Order By ID limit 90001) As tmp) limit 100;2.Select * From cyclopedia Where ID=(Select Max(ID) From (Select ID From cyclopedia Order By ID limit 90000,1) As tmp) limit 100;同样是取90000条后100条记录,第1句快还是第2句快?第1句是先取了前90001条记录,取其中最大一个ID值作为起始标识,然后利用它可以快速定位下100条记录第2句择是仅仅取90000条记录后1条,然后取ID值作起始标识定位下100条记录第1句执行结果.100 rows in set (0.23) sec第2句执行结果.100 rows in set (0.19) sec很明显第2句胜出.看来limit好像并不完全像我之前想象的那样做全表扫描返回limit offset+length条记录,这样看来limit比起MS-SQL的Top性能还是要提高不少的.其实第2句完全可以简化成Select * From cyclopedia Where ID=(Select ID From cyclopedia limit 90000,1)limit 100;直接利用第90000条记录的ID,不用经过Max运算,这样做理论上效率因该高一些,但在实际使用中几乎看不到效果,因为本身定位ID返回的就是1条记录,Max几乎不用运作就能得到结果,但这样写更清淅明朗,省去了画蛇那一足.可是,既然MySQL有limit可以直接控制取出记录的位置,为什么不干脆用Select * From cyclopedia limit 90000,1呢?岂不更简洁?这 样想就错了,试了就知道,结果是:1 row in set (8.88) sec,怎么样,够吓人的吧,让我想起了昨天在4.1中比这还有过之的高分.Select * 最好不要随便用,要本着用什么,选什么的原则, Select的字段越多,字段数据量越大,速度就越慢. 上面2种分页方式哪种都比单写这1句强多了,虽然看起来好像查询的次数更多一些,但实际上是以较小的代价换取了高效的性能,是非常值得的.第1种方案同样可用于MS-SQL,而且可能是最好的.因为靠主键ID来定位起始段总是最快的.Select Top 100 * From cyclopedia Where ID=(Select Top 90001 Max(ID) From (Select ID From cyclopedia Order By ID) As tmp)但不管是实现方式是存贮过程还是直接代码中,瓶颈始终在于MS-SQL的TOP总是要返回前N个记录,这种情况在数据量不大时感受不深,但如果成百上千万,效率肯定会低下的.相比之下MySQL的limit就有优势的多,执行:Select ID From cyclopedia limit 90000Select ID From cyclopedia limit 90000,1的结果分别是:90000 rows in set (0.36) sec1 row in set (0.06) sec而MS-SQL只能用Select Top 90000 ID From cyclopedia 执行时间是390ms,执行同样的操作时间也不及MySQL的360ms.-LIMIT 思考PERCONA PERFORMANCE CONFERENCE 2009上,来自雅虎的几位工程师带来了一篇”Efficient Pagination Using MySQL“的报告,有很多亮点,本文是在原文基础上的进一步延伸。首先看一下分页的基本原理:mysql explain SELECT * FROM message ORDER BY id DESC LIMIT 10000, 20G* 1. row *id: 1select_type: SIMPLEtable: messagetype: indexpossible_keys: NULLkey: PRIMARYkey_len: 4ref: NULLrows: 10020Extra:1 row in set (0.00 sec)limit 10000,20的意思扫描满足条件的10020行,扔掉前面的10000行,返回最后的20行,问题就在这里,如果是limit 100000,100,需要扫描100100行,在一个高并发的应用里,每次查询需要扫描超过10W行,性能肯定大打折扣。文中还提到limit n性能是没问题的,因为只扫描n行。文中提到一种”clue”的做法,给翻页提供一些”线索”,比如还是SELECT * FROM message ORDER BY id DESC,按id降序分页,每页20条,当前是第10页,当前页条目id最大的是9527,最小的是9500,如果我们只提供”上一页”、”下一页”这样的跳转(不提供到第N页的跳转),那么在处理”上一页”的时候SQL语句可以是:SELECT * FROM message WHERE id 9527 ORDER BY id ASC LIMIT 20;处理”下一页”的时候SQL语句可以是:SELECT * FROM message WHERE id 9500 ORDER BY id DESC LIMIT 20;不管翻多少页,每次查询只扫描20行。缺点是只能提供”上一页”、”下一页”的链接形式,但是我们的产品经理非常喜欢”这样的链接方式,怎么办呢?如果LIMIT m,n不可避免的话,要优化效率,只有尽可能的让m小一下,我们扩展前面的”clue”做法,还是SELECT * FROM message ORDER BY id DESC,按id降序分页,每页20条,当前是第10页,当前页条目id最大的是9527,最小的是9500,比如要跳到第8页,我看的SQL语句可以这样写:SELECT * FROM message WHERE id 9527 ORDER BY id ASC LIMIT 20,20;跳转到第13页:SELECT * FROM message WHERE id 9500 ORDER BY id DESC LIMIT 40,20;原理还是一样,记录住当前
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 建筑工程夏季施工防暑方案
- 供水管网冬季防冻保护方案
- 2025年神经外科脑部手术操作技能评估答案及解析
- 2025年胃肠病胃肠炎护理护士实操答案及解析
- 2025年内分泌科糖尿病并发症防治综合能力测试卷答案及解析
- 2025年口腔颌面外科手术技能操作训练考核答案及解析
- 2025年妇产科产前诊断产检技能考核答案及解析
- 2025年急诊医学道路交通事故伤员手术风险评估模拟考试卷答案及解析
- 2025年中药学中药处方合理性评估答案及解析
- 2025年法医学鉴定技术解读能力测试答案及解析
- 物业公司水电费收费表
- 六年级数学上册教案6:分数乘法:分数乘小数-人教版
- 商场撤场申请书
- 教育评价学全套ppt课件完整版教学教程
- 基础有机化学:第2章 饱和烃
- 五年级英语阅读理解(20篇)
- 台州方言百余年来的语音变化阮咏梅
- 《中华人民共和国民法典》知识竞赛考试
- T∕CPSS 1007-2021 公用交流电网稳态电能质量综合指标评估方法
- 风电项目升压站土建工程安全文明二次策划施工技术措施
- 小学美术课件-第4课诱人的水果-广西版(26张PPT)ppt课件
评论
0/150
提交评论