Mysql的“Limit”操作

Limit操作:

select * from table LIMIT 5,10;   #返回第6-15行数据
select * from table LIMIT 5;      #返回前5行
select * from table LIMIT 0,5;    #返回前5行

性能优化:

基于MySQL5.0中limit的高性能,我对数据分页也重新有了新的认识.
测试SQL语句1:

Select * From cyclopedia
  Where ID>=(
          Select Max(ID)
          From (Select ID From cyclopedia Order By ID limit 90001) As tmp
        ) limit 100;

测试SQL语句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;

讲解说明:
  1.直接利用第90000条记录的ID,不用经过Max运算,这样做理论上效率因该高一些,但在实际使用中几乎看不到效果,因为本身定位ID返回的就是1条记录,Max几乎不用运作就能得到结果,但这样写更清淅明朗,省去了画蛇那一足.

  2.可是,既然MySQL有limit可以直接控制取出记录的位置,为什么不干脆用Select * From cyclopedia limit 90000,1呢?岂不更简洁?
这样想就错了,试了就知道,结果是:1 row in set (8.88) sec,怎么样,够吓人的吧,让我想起了昨天在4.1中比这还有过之的"高分".Select * 最好不要随便用,要本着用什么,选什么的原则, Select的字段越多,字段数据量越大,速度就越慢. 上面2种分页方式哪种都比单写这1句强多了,虽然看起来好像查询的次数更多一些,但实际上是以较小的代价换取了高效的性能,是非常值得的.

  3.第1种方案同样可用于MS-SQL,而且可能是最好的.因为靠主键ID来定位起始段总是最快的.

MS-SQL的TOP:

Select Top 100 * From cyclopedia
  Where ID>=(
          Select Top 90001 Max(ID)
          From (
               Select ID From cyclopedia Order By ID
             ) As tmp
) 

top介绍:

  但不管是实现方式是存贮过程还是直接代码中,瓶颈始终在于MS-SQL的TOP总是要返回前N个记录,这种情况在数据量不大时感受不深,但如果成百上千万,效率肯定会低下的.相比之下MySQL的limit就有优势的多.

测试SQL语句1:

Select ID From cyclopedia limit 90000

测试SQL语句2:

Select ID From cyclopedia limit 90000,1

测试结果-时间:
  90000 rows in set (0.36) sec
  1 row in set (0.06) sec
而MS-SQL只能用

Select Top 90000 ID From cyclopedia

执行时间是390ms,执行同样的操作时间也不及MySQL的360ms. 

本文出自:http://www.zhenhua.org/article.asp?id=200

时间: 2024-08-28 04:42:10

Mysql的“Limit”操作的相关文章

mysql数据库表操作及授权

表操作:增删改查 把/etc/passwd文件的内容导入 passwd表里. mysql>load data infile"/etc/passwd" into table passwd fields terminated by ":"; 基于前面的passwd表,完成下列操作: 1:列出uid低于500且3个字母的用户 mysql> select name from passwd where uid<500 and name like "

边记边学PHP-(十四)MySql数据库基础操作1

提到数据库,相信都不陌生.比较常见的是SQL Server . Oracle.Access.SQLite等等.当然还有PHP的黄金搭档,MySql数据库.当然我所写的都是MySql的一些基础,我还没有深入的学习这个数据库.深入学习还需要一段时间.但是现在学的基础基本满足我现在的学习需要. 一.MySQL简介 1.MySQL是什么 MySQL是一款安全.跨平台.高效的,并与PHP.Java等主流编程语言紧密结合的数据库系统.该数据库系统是由瑞典的MySQL AB公司开发.发布并支持,由MySQL初

[Sqoop]利用sqoop对mysql执行DML操作

业务背景 利用sqoop对mysql进行查询.添加.删除等操作. 业务实现 select操作: sqoop eval --connect jdbc:mysql://127.0.0.1:3306/market --username admin --password 123456 --query "select end_user_id, category_id, score, last_bought_date, days_left, update_time from market.PERIOD_RE

MySQL 大数据操作注意事项

MySQL 大数据操作注意事项 http://netkiller.github.io/journal/mysql.parallel.html Mr. Neo Chen (netkiller), 陈景峰(BG7NYT) 目录 1. 关于 delete 2. 关于 update 3. 关于创建索引 4. 关于 OPTIMIZE 5. 关于切换引擎 6. 确保SELECT不被受阻 1. 关于 delete delete from mytable 必死无疑,你需要分批删除,尽量缩小每个批次删除的记录数,

MySQL的limit用法和分页查询的性能分析及优化

申明:本博文转发于 点击链接跳转 一.limit用法在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能. SELECT * FROM table LIMIT [offset,] rows | `rows OFFSET offset ` (LIMIT offset, `length`)SELECT*FROM tablewhere condition1 = 0and condition2 = 0and condition3

Mysql数据库常用操作

1.备份数据库 [[email protected] ~]# mysqldump -h 192.168.0.8 -uroot  -p'123456'  user >user.sql 2.查看mysql数据库字符集设置 mysql> show variables like 'character_set_%';+--------------------------+----------------------------+| Variable_name            | Value    

MySQL查询in操作 查询结果按in集合顺序显示_Mysql_脚本之家

body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI",Tahoma,Helvetica,Sans-Serif,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5;

mysql的基础操作指令整理|环境redhat6

1.安装 yum-y install mysql mysql-server service mysqld start|stop|restart        ##启动|停止|重启 chkconfig mysqld on|off                  ##开机启动|关闭 此时输入:mysql就能启动进入(记得是start状态) 2.改密 mysqladmin –uroot password             ##创建密码 mysqladmin–uroot –pxxoo passw

ibatis配置mysql的limit

<select id="xxx" > select * from xxx <dynamic prepend = "limit " > <isNotEqual property="num" compareValue="0" > 0,#num# </isNotEqual> </dynamic> </select> 或者 <select id="