关于MySQL的LIMIT 语法小优化
今天有朋友问起此类语句的优化,我大致给他介绍了下从SQL角度做简单的优化,至于应用程序方面的考虑咱暂时不考虑。
下面我来举一个简单的例子。
考虑如下表结构:
/*DDL Information For - t_girl.t_page_sample*/
----------------------------------------------
Table Create Table
------------- ----------------------------------------------------------------
t_page_sample CREATE TABLE `t_page_sample` (
`id` int(10) unsigned NOT NULL,
`v_state` tinyint(1) NOT NULL DEFAULT '1',
`log_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
我的测试系统为标配DELL D630,XP系统。
示例表的记录数:
select count(*) from t_page_sample;
<!-->
query result(1 records)
count(*)
993098
下面我们来一步一步看看下面的这条语句:
explain select sql_no_cache * from t_page_sample order by id asc limit 900001,20;
<!-->
<!-->
query result(1 records)
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t_page_sample ALL (NULL) (NULL) (NULL) (NULL) 993098 Using filesort
从上面可以看出,她没有用到任何索引,扫描的行数为993098,而且用到了排序!
select sql_no_cache * from t_page_sample order by id asc limit 900001,20;
(20 row(s)returned)
(4688 ms taken)
那么我们怎么优化这条语句呢?
首先,我们想到的是索引。
在这条语句中,只有ID可能能用到索引,那么我们给优化器
加一个暗示条件,让他用到索引。
select sql_no_cache * from t_page_sample force index (primary) order by id asc limit 900001,20;
(20 row(s)returned)
(9239 ms taken)
没想到用的时间竟然比不加索引还长。
看来这条路好像走不通了。
我们尝试着变化下语句如下:
select * from t_page_sample
where id between
(select sql_no_cache id from t_page_sample order by id asc limit 900001,1)
and
(select sql_no_cache id from t_page_sample order by id asc limit 900020,1);
(20 row(s)returned)
(625 ms taken)
哇,这个很不错,足足缩短了将近15倍!
那么还有优化的空间吗?
我们再次变化语句:
select * from t_page_sample
where id >= ( select sql_no_cache id from t_page_sample order by id asc limit 900001,1)
limit 20;
(20 row(s)returned)
(406 ms taken)
时间上又比上次的语句缩短了1/3。
可喜可贺。
本文来自CSDN博客,转载请标明出处:/yueliangdao0608/archive/2010/04/26/5530713.aspx。
MySQLlimit的用法
MySQLlimit的用法一级标题:MySQL limit的用法二级标题:介绍MySQL limit的功能和作用MySQL是一种关系型数据库管理系统,被广泛应用于各类网站和应用程序中。
在处理大量数据时,我们经常需要从数据库中获取特定数量的记录,这就涉及到了MySQL limit的用法。
MySQL limit语句可以帮助我们控制查询结果的数量,并且还能与其他SQL语句配合使用进行分页操作。
二级标题:基本语法和使用方式MySQL数据库通过limit关键字实现限制查询结果集的数量。
其基本语法如下:```SELECT * FROM 表名 LIMIT [偏移量,] 行数;```其中,偏移量代表从查询结果集开始处跳过的记录数,行数则表示返回的记录数目。
通常情况下,我们可以直接写一个数字来指定返回的记录数。
例如,LIMIT 10将返回数据库中前10条记录。
如果需要指定偏移量,则使用逗号分隔开偏移量和行数。
例如,LIMIT 5, 10表示从第6条记录开始返回10条记录。
二级标题:实际应用案例限制查询结果集的数量是多种情景中常见需求之一。
1. 分页显示数据:当处理大量数据时,将所有数据都展示在一页上可能会导致加载时间过长或页面卡顿。
通过使用limit语句,我们可以在每次页面请求时仅返回特定页的数据,从而实现分页功能。
对于带有页码参数的请求,我们可以使用limit关键字按照每页显示固定记录数目来执行SQL查询。
例如,我们有一个用户信息表user_info,需要将该表中的数据进行分页展示。
假设每页显示10条记录,并且用户请求第3页的数据,则MySQL查询语句应为:```SELECT * FROM user_info LIMIT 20, 10;```2. Top N查询:有时候我们只关注数据集合中排名靠前或靠后的几条记录。
通过使用limit语句,我们可以轻松提取出top N的数据。
例如,一个电商网站想要获取销量最高的5个商品,并显示在主页上。
limit在mysql中的用法
limit在mysql中的用法1. 介绍在MySQL中,LIMIT是一个非常有用的关键字,用于限制查询结果的返回数量。
它可以让我们只获取我们需要的数据,而不必返回整个结果集。
LIMIT语句通常与SELECT语句结合使用,但也可以与DELETE和UPDATE语句一起使用。
2. 语法LIMIT语句的基本语法如下:SELECT column1, column2, ...FROM table_nameLIMIT offset, count;其中,offset表示偏移量(即从第几条记录开始返回),count表示要返回的记录数。
3. 示例3.1 返回前n条记录假设我们有一个名为employees的表,其中包含员工的信息。
如果我们只想返回前5条记录,可以使用以下查询:SELECT *FROM employeesLIMIT 5;这将返回表中的前5行数据。
3.2 返回指定范围内的记录除了指定要返回的记录数目外,我们还可以指定要从哪一行开始返回数据。
例如,如果我们只想返回第6到第10行之间的记录,可以使用以下查询:SELECT *FROM employeesLIMIT 5, 5;这将跳过前5行,并返回接下来的5行数据。
3.3 使用ORDER BY排序后再进行限制在某些情况下,我们可能希望先对结果进行排序,然后再进行限制。
这时,可以使用ORDER BY子句来指定排序的列,并在LIMIT语句之前使用它。
例如,如果我们想按照员工的薪水从高到低返回前3个记录,可以使用以下查询:SELECT *FROM employeesORDER BY salary DESCLIMIT 3;这将按照薪水从高到低排序结果,并返回前3个记录。
3.4 使用OFFSET关键字除了使用offset, count形式的LIMIT语法外,MySQL还支持使用OFFSET关键字来指定偏移量。
例如,以下两个查询是等价的:SELECT *FROM employeesLIMIT 5, 5;SELECT *FROM employeesLIMIT 5 OFFSET 5;它们都将跳过前5行,并返回接下来的5行数据。
Mysql-Limit优化
Mysql-Limit优化limit 查询导出优化耗时本质mysql⼤数据量使⽤limit分页,随着页码的增⼤,查询效率越低下。
当⼀个表数据有⼏百万的数据的时候成了问题!如 select * from table limit 0,10 这个没有问题当 limit 200000,10 的时候数据读取就很慢原因本质: 1)limit语句的查询时间与起始记录(offset)的位置成正⽐ 2)mysql的limit语句是很⽅便,但是对记录很多:百万,千万级别的表并不适合直接使⽤。
例如: limit10000,20的意思扫描满⾜条件的10020⾏,扔掉前⾯的10000⾏,返回最后的20⾏,问题就在这⾥。
LIMIT 2000000, 30 扫描了200万+ 30⾏,怪不得慢的都堵死了,甚⾄会导致磁盘io 100%消耗。
但是: limit 30 这样的语句仅仅扫描30⾏。
优化⼿段⼲掉或者利⽤ limit offset,size 中的offset不是直接使⽤limit,⽽是⾸先获取到offset的id然后直接使⽤limit size来获取数据对limit分页问题的性能优化⽅法利⽤表的覆盖索引来加速分页查询覆盖索引:就是select 的数据列只⽤从索引中就能获得,不必读取数据⾏。
mysql 可以利⽤索引返回select列表中的字段,⽽不必根据索引再次读取数据⽂件,换句话说:查询列要被所创建的索引覆盖因为利⽤索引查找有优化算法,且数据就在查询索引上⾯,不⽤再去找相关的数据地址了,这样节省了很多时间。
另外Mysql中也有相关的索引缓存,在并发⾼的时候利⽤缓存就效果更好了。
在我们的例⼦中,我们知道id字段是主键,⾃然就包含了默认的主键索引。
这次我们之间查询最后⼀页的数据(利⽤覆盖索引,只包含id列),如下:#覆盖索引只包含id列的时间显著优于select*不⾔⽽喻select*from order_table where company_id =1and mark =0order by id desc limit 200000 ,20;select id from order_table where company_id =1and mark =0order by id desc limit 200000 ,20;那么如果我们也要查询所有列,有两种⽅法,⼀种是id>=的形式,另⼀种就是利⽤join,看下实际情况:#两者⽤的都是⼀个原理嘛,所以效果也差不多SELECT*FROM xxx WHERE ID >=(select id from xxx limit 1000000, 1) limit 20;SELECT*FROM xxx a JOIN (select id from xxx limit 1000000, 20) b ON a.ID = b.id;环境准备1. test_dev.order_table 300万数据2. test_begin.order_table 5000万数据环境差异:两边表结构->索引不⼀样,会存再同样查询前20万数据 test_begin ⽐ test_dev 快些实战1:数据量百万级别利⽤或使⽤ offset#show profiles 分析性能#临时开启SET profiling =1;#查询时候以⾮缓存⽅式查询验证:select SQL_NO_CACHE ......#20-40万:1255907360-80万:12159073160-180万:11159073260-280万:10158757#含 offset 查询->平均耗时:9.958s 左右select SQL_NO_CACHE *from order_table where company_id =1and mark =0order by id desc limit 200000 ,200000;#分开查询先查询最⼤id 在执⾏ id<=max的效率性能与合在⼀起⼏乎⼀致#平均耗时:7.505s 左右select id from order_table where company_id =1and mark =0order by id desc limit 200000 ,1;#平均耗时:9.092s 左右select*from order_table where company_id =1and mark =0and id <=12559073order by id desc limit 200000;#覆盖索引获取max => id<=max->平均耗时:17.576s 左右select SQL_NO_CACHE *from order_table where company_id =1and mark =0and id <= (select id from order_table where company_id =1and mark =0order by id desc limit 200000 ,1) order by id desc limit 200000; #覆盖索引+join->平均耗时:11.325s 左右select SQL_NO_CACHE p.*from order_table p join (select id from order_table where company_id =1and mark =0order by id desc limit 200000 ,200000) a on a.id = p.id;性能分析说明show profile CPU,SWAPS,BLOCK IO,MEMORY,SOURCE for query 520;⽅式1.limit offset,size(含⼦查询)20-40万60-80万160-180万260-280万⽅式2.id < max and limit sizeps: 实战中可以直接将上⼀页的最⼩id 传⼊到下⼀页查询中当max使⽤,从⽽节省⼦查询的消耗。
mysql 的limit的用法
MySQL的LIMIT的用法一、概述在MySQL中,LIMIT是一种用于限制查询结果集返回行数的关键字。
它可以配合SELECT语句使用,用于指定返回结果的起始位置和总行数。
通过合理使用LIMIT,可以提高查询效率,避免返回大量不必要的数据。
二、基本语法LIMIT关键字的基本语法如下:SELECT column_name(s)FROM table_nameLIMIT offset, count;其中,offset指定返回结果集的起始位置,count指定返回结果集的总行数。
三、使用示例下面通过一些示例来演示LIMIT的用法。
1. 返回前N行数据如果我们只想返回查询结果中的前N行数据,可以使用以下语法:SELECT *FROM table_nameLIMIT N;这将返回表中的前N行数据。
2. 返回指定范围的数据如果我们想要返回查询结果中的某个范围的数据,可以使用以下语法:SELECT *FROM table_nameLIMIT offset, count;其中,offset为起始位置,count为需要返回的总行数。
例如,如果我们想要返回表中的第6到第10行数据,可以使用以下语句:SELECT *FROM table_nameLIMIT 5, 5;这将返回表中的第6到第10行数据。
3. 结合ORDER BY使用LIMIT关键字经常与ORDER BY一起使用,以便在按照指定的排序规则返回结果集的同时,限制返回的行数。
例如,如果我们想要返回表中按照某个字段排序后的前N行数据,可以使用以下语句:SELECT *FROM table_nameORDER BY column_nameLIMIT N;这将返回按照column_name字段排序后的前N行数据。
4. 结合子查询使用LIMIT关键字还可以结合子查询使用,以便在子查询的结果集中限制返回的行数。
例如,如果我们想要返回表中满足某个条件的前N行数据,可以使用以下语句:SELECT *FROM (SELECT *FROM table_nameWHERE conditionLIMIT N) AS subquery;这将返回满足condition条件的前N行数据。
MySQL优化之—limit
MySQL优化之—limit
问题描述:通常情况下MySQL数据库表查询通过limit关键字进⾏分页,当数据量不多时,能够⾮常快速返回数据据,但当数据达到百万级别是,当前页数字越⼤响应时间越长。
举个例⼦:⽤户表 200w 数据
select*from t_user limit 0,20
这是没有问题的,数据很快返回
select*from t_user limit 1000080,20
上⾯这条语句返回⽐较慢。
原因:limit 0,20 仅扫描了20条数据,就返回结果,⽽ limit 1000080,20 扫描了1000080条数据,并去掉前⾯1000080条,返回剩下的20条数据。
解决⽅案1:记录上⼀次的最⼤maxId=1000079, 那么语句可以优化为:
select*from t_user where id>1000079order by id limit 20
扫描20⾏。
总结: 当⼀个数据库表过于庞⼤,LIMIT offset, length中的offset值过⼤,则SQL查询语句会⾮常缓慢,你需增加order by,并且order by字段需要建⽴索引
解决⽅案2:如果limit的offset值过⼤,设置⼀个offset最⼤的,超过了可以另⾏处理,如:当偏移超过⼀半记录数的时候,先⽤排序,这样偏移就反转了。
解决⽅案3:>limit限制优化法把limit偏移量设置⼀个最⼤值。
超过这个数不查询数据库,直接返回空数据。
mysql limit机制 -回复
mysql limit机制-回复MySQL是一种流行的关系型数据库管理系统,被广泛应用于各种应用程序和网站中。
在MySQL中,使用LIMIT语句可以限制返回结果的数量。
LIMIT语句可以结合ORDER BY子句一起使用,以指定结果的排序顺序。
一、LIMIT语句的基本语法LIMIT语句的基本语法如下所示:SELECT column1, column2, ...FROM table[WHERE condition][ORDER BY column(s)]LIMIT start, count;其中,column1, column2, ...表示要返回的列名,table表示要查询的表名,condition表示查询条件,column(s)表示排序的列名,start表示结果集的开始位置,count表示要返回的行数。
如果省略start,则默认为0,即从第一行开始;如果省略count,则默认返回所有行。
二、LIMIT语句的用途LIMIT语句的用途非常广泛,可以满足各种数据查询的需求。
以下是LIMIT 语句的几个常见用途:1. 分页查询:在Web开发中,经常需要将大量数据按页显示。
使用LIMIT 语句可以轻松实现分页功能,只需指定相应的start和count即可。
2. 限制结果集数量:有时候我们只关心前几条数据,或者只想返回部分数据用于测试和调试。
LIMIT语句可以帮助我们方便地限制返回结果的数量。
3. TOP N查询:有时候我们只需要返回前N条数据,不需要返回全部数据。
LIMIT语句可以很方便地实现这个功能。
三、LIMIT语句的示例接下来,我们将通过一些具体的示例来说明如何使用LIMIT语句。
1. 分页查询示例:假设我们有一个用户表users,包含了很多用户的信息,现在我们需要实现一个分页功能,每页显示10条记录。
我们可以使用以下SQL语句来实现:SELECT * FROM usersLIMIT 0, 10;这将返回users表中的前10条记录。
mysql limit高级用法
mysql limit高级用法MySQL的`LIMIT`子句是一个非常有用的工具,它用于限制查询返回的记录数。
虽然最常用的用法是使用两个参数(起始位置和数量),但`LIMIT`还有一些高级用法。
1. 使用OFFSET:你可以使用`OFFSET`来跳过查询结果中的指定行数。
例如,要跳过前10行并获取接下来的10行,你可以这样做:```sqlSELECT FROM table_name LIMIT 10 OFFSET 10;```2. 使用变量:在存储过程中,你可以使用变量来动态设置`LIMIT`的值。
例如:```sqlSET limit = 10;SELECT FROM table_name LIMIT limit;3. 与其他子句结合使用:`LIMIT`可以与其他子句(如`ORDER BY`)结合使用,以确保在排序后返回的记录数。
例如,要获取前10个按某种排序的记录,可以这样做:```sqlSELECT FROM table_name ORDER BY column_name DESC LIMIT 10; ```4. 与其他数据库的限制进行比较:尽管`LIMIT`在许多SQL数据库中都有类似的用法,但并不是所有的数据库都支持`OFFSET`。
例如,在SQL Server中,你需要使用不同的语法:```sqlSELECT FROM table_name ORDER BY column_name DESC OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;```5. 与其他子句的结合:你还可以将`LIMIT`与其他子句(如`JOIN`、`WHERE`等)结合使用,以执行更复杂的查询。
例如,要获取特定条件下的前10条记录:```sqlSELECT FROM table1 JOIN table2 ON = WHERE condition_column = 'value' LIMIT 10;```6. 与其他数据库兼容性:如果你的应用程序需要与多个数据库系统兼容,请注意不是所有数据库系统都支持`LIMIT`和`OFFSET`子句。
mysql limit 语法
mysql limit 语法
limit语法是MySQL用来进行限制结果的语句,它的格式为:
SELECT A星 FROM 表名 LIMIT 起始位置,偏移量
A星代表你要查询的字段,表名就是查找数据的库表了,起始位置索引从0开始,偏移量指你要查找多少条记录。
下面来看看limit具体怎么使用:
一、LIMIT 用于分页数据
当我们要把查询到的大量数据分页显示时,就可以用limit来实现:
例如,现在要把表user中的数据每页显示10条
SELECT * FROM user LIMIT 0,10 这句就返回前10条数据
以此类推,每页的数据的开始位置就是(当前页码-1)×每页显示的条目数
二、LIMIT 作为简易排序用途
当我们想要把查询结果按时间 asc 或 desc 来排序时,就可以用 limit来实现,如要查询数据表user 中前20条数据:
这句语句是先将user表中id按降序排序,此时最前面的20条数据就是最新添加的20条数据
三、LIMIT 作为统计函数
有时候,我们使用min() 或者max ()等函数计算最小值或最大值时,可以结合limit来使用,例如当前表user 中id的最大值:
上面这句语句就能返回数据表user 中id的最大值
以上就是limit语句的用法,用这个语句可以完成很多复杂操作,比如限制结果,排序,分页,数据统计等。
由此我们可以大大提高查找数据的效率,节省不少时间。
limit 优化方法
mysql limit 优化方法SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offsetLIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。
LIMIT 接受一个或两个数字参数。
参数必须是一个整数常量。
如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。
初始记录行的偏移量是 0(而不是 1):为了与 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。
mysql> SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15//为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1:mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last.//如果只给定一个参数,它表示返回最大的记录行数目:mysql> SELECT * FROM table LIMIT 5; //检索前 5 个记录行//换句话说,LIMIT n 等价于 LIMIT 0,n。
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呢?岂不更简洁?。
limit在mysql中的用法
limit在mysql中的用法Limit在MySQL中的用法MySQL是一种常用的关系型数据库管理系统,提供了丰富的查询功能。
其中,limit子句用于控制查询结果的数量。
本篇文章将详细介绍limit在MySQL中的用法。
1. 基本用法limit子句一般紧跟在select语句的后面,用于指定查询结果的起始位置和数量。
其基本语法如下:SELECT column1, column2, ...FROM tableLIMIT offset, count;其中,offset表示查询结果的起始位置,从0开始计数;count 表示查询结果的数量。
示例1:查询前5条记录SELECT name, ageFROM studentsLIMIT 5;上述语句将返回表students中的前5条记录,包括name和age 列。
示例2:查询第6到第10条记录SELECT name, ageFROM studentsLIMIT 5, 5;上述语句将返回表students中从第6条到第10条记录,包括name和age列。
2. 结合排序与limit一同使用时,排序可以帮助我们按照特定的规则获取有序的查询结果。
示例3:查询年龄最大的3个学生信息SELECT name, ageFROM studentsORDER BY age DESCLIMIT 3;上述语句将按照学生的年龄降序排列,并返回前3个学生的姓名和年龄。
示例4:查询年龄最小的5个学生信息SELECT name, ageFROM studentsORDER BY ageLIMIT 5;上述语句将按照学生的年龄升序排列,并返回前5个学生的姓名和年龄。
3. 分页查询limit常常用于实现分页查询功能,即每次返回一定数量的结果,以实现较大结果集的分批加载。
示例5:查询第11页的学生信息SELECT name, ageFROM studentsORDER BY idLIMIT 10 OFFSET 100;上述语句将按照学生的id升序排列,并跳过前100条记录,返回从第101条记录开始的10条学生的姓名和年龄,即第11页的学生信息。
