1、Limit关键字的使用

查询数据时,可能会查询出很多的记录。而用户需要的记录可能只是很少的一部分。这样就需要来限制查询结果的数量。Limit是MySQL中的一个特殊关键字。Limit子句可以对查询结果的记录条数进行限定,控制它输出的行数。

在MySQL数据库中创建用户信息表(tb_user),并添加数据用于测试使用。

-- 判断数据表是否存在,存在则删除

DROP TABLE IF EXISTS tb_user;

-- 创建“用户信息”数据表

CREATE TABLE IF NOT EXISTS tb_user

(

user_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户编号',

user_name VARCHAR(50) NOT NULL COMMENT '用户姓名',

province VARCHAR(50) NOT NULL COMMENT '省份'

) COMMENT = '用户信息表';

-- 添加数据

INSERT INTO tb_user(user_name,province) VALUES

('pan_junbiao的博客_01','广东省'),('pan_junbiao的博客_02','黑龙江省'),('pan_junbiao的博客_03','山东省'),('pan_junbiao的博客_04','安徽省'),('pan_junbiao的博客_05','黑龙江省'),

('pan_junbiao的博客_06','江苏省'),('pan_junbiao的博客_07','黑龙江省'),('pan_junbiao的博客_08','广东省'),('pan_junbiao的博客_09','陕西省'),('pan_junbiao的博客_10','广东省'),

('pan_junbiao的博客_11','广东省'),('pan_junbiao的博客_12','江苏省'),('pan_junbiao的博客_13','陕西省'),('pan_junbiao的博客_14','安徽省'),('pan_junbiao的博客_15','山东省'),

('pan_junbiao的博客_16','陕西省'),('pan_junbiao的博客_17','安徽省'),('pan_junbiao的博客_18','江苏省'),('pan_junbiao的博客_19','黑龙江省'),('pan_junbiao的博客_20','安徽省'),

('pan_junbiao的博客_21','江苏省'),('pan_junbiao的博客_22','广东省'),('pan_junbiao的博客_23','安徽省'),('pan_junbiao的博客_24','陕西省'),('pan_junbiao的博客_25','广东省'),

('pan_junbiao的博客_26','广东省'),('pan_junbiao的博客_27','安徽省'),('pan_junbiao的博客_28','山东省'),('pan_junbiao的博客_29','山东省'),('pan_junbiao的博客_30','黑龙江省'),

('pan_junbiao的博客_31','广东省'),('pan_junbiao的博客_32','江苏省'),('pan_junbiao的博客_33','陕西省'),('pan_junbiao的博客_34','安徽省'),('pan_junbiao的博客_35','山东省');

1.1 语法格式1

LIMIT m;

m:表示查询多少条记录。

【示例】查询用户信息表(tb_user),按照 user_id 编号进行升序排列,显示前5条记录。

SELECT * FROM tb_user

ORDER BY user_id

LIMIT 5

执行结果:

1.2 语法格式2

LIMIT m , n;

m:表示开始查询的第一条记录的编号(注意:在查询结果中,第一个结果的记录编号是0,而不是1)。

n:表示查询多少条记录。

【示例】查询用户信息表(tb_user),按照 user_id 编号进行升序排列,从编号10开始,查询后面5条记录。

SELECT * FROM tb_user

ORDER BY user_id

LIMIT 10,5

执行结果:

2、使用Limit分页查询的性能优化

【示例】在存储过程中使用Limit的优化查询。

2.1 使用一般分页查询(不推荐)

DELIMITER $$

-- 方式一:使用一般分页查询(不推荐)

DROP PROCEDURE IF EXISTS proc_user_page$$

CREATE PROCEDURE proc_user_page(IN page_index INT,IN page_size INT)

BEGIN

DECLARE begin_no INT;

SET begin_no = (page_index-1)*page_size;

SELECT * FROM tb_user

ORDER BY user_id ASC

LIMIT begin_no,page_size;

END$$

DELIMITER ;

调用存储过程:查询第2页,每页5条记录。

-- 调用存储过程:查询第2页,每页5条记录

CALL proc_user_page(2,5);

执行结果:

弊端:方式一虽然实现了分页功能,但随着查询偏移的增大,尤其查询偏移大于10万以后,查询时间将急剧增加。这种分页查询方式会从数据库第一条记录开始扫描,所以越往后,查询速度越慢,而且查询的数据越多,也会拖慢总查询速度。

2.2 使用子句优化查询(推荐)

DELIMITER $$

-- 方式二:使用子句优化查询(推荐)

DROP PROCEDURE IF EXISTS proc_optimize$$

CREATE PROCEDURE proc_optimize(IN page_index INT,IN page_size INT)

BEGIN

DECLARE begin_no INT;

SET begin_no = (page_index-1)*page_size;

SELECT * FROM tb_user

WHERE user_id >= (

SELECT user_id FROM tb_user

ORDER BY user_id ASC

LIMIT begin_no,1

)

ORDER BY user_id ASC

LIMIT page_size;

END$$

DELIMITER ;

调用存储过程:查询第3页,每页5条记录。

-- 调用存储过程:查询第3页,每页5条记录

CALL proc_optimize(3,5);

执行结果:

优点:方式二适合数据表的id是连续递增的,则可以根据查询的页数和查询的记录数可以算出查询的id的范围。这种查询方式能够极大地优化查询速度,基本能够在几十毫秒之内完成。限制是只能使用于明确知道id的情况,不过一般建立表的时候,都会添加基本的自增的主键id字段,这为分页查询带来很多便利。

3、Limit的效率问题

3.1 Limit的效率高?

常说的Limit的执行效率高,是对于一种特定条件下来说的:即数据库的数量很大,但是只需要查询一部分数据的情况。

高效率的原理是:避免全表扫描,提高查询效率。

比如:每个用户的email是唯一的,如果用户使用email作为用户名登陆的话,就需要查询出email对应的一条记录。

SELECT * FROM t_user WHERE email=?;

上面的语句实现了查询email对应的一条用户信息,但是由于email这一列没有加索引,会导致全表扫描,效率会很低。

SELECT * FROM t_user WHERE email=? LIMIT 1;

加上LIMIT 1,只要找到了对应的一条记录,就不会继续向下扫描了,效率会大大提高。

3.2 Limit的效率低?

在一种情况下,使用limit效率低,那就是:只使用limit来查询语句,并且偏移量特别大的情况

做以下实验:

语句1:

select * from table limit 150000,1000;

语句2:

select * from table while id>=150000 limit 1000;

语句1为0.2077秒;语句2为0.0063秒

两条语句的时间比是:语句1/语句2=32.968

比较以上的数据时,我们可以发现采用where...limit....性能基本稳定,受偏移量和行数的影响不大,而单纯采用limit的话,受偏移量的影响很大,当偏移量大到一定后性能开始大幅下降。不过在数据量不大的情况下,两者的区别不大。

所以应当先使用where等查询语句,配合limit使用,效率才高

ps:在sql语句中,limt关键字是最后才用到的。以下条件的出现顺序一般是:where->group by->having-order by->limit

附录:OFFSET

为了与 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。

经常用到在数据库中查询中间几条数据的需求

比如下面的sql语句:

selete * from testtable limit 2,1;

selete * from testtable limit 2 offset 1;

注意:

1.数据库数据计算是从0开始的

2.offset X是跳过X个数据,limit Y是选取Y个数据

3.limit  X,Y  中X表示跳过X个数据,读取Y个数据

这两个都是能完成需要,但是他们之间是有区别的:

(1)是从数据库中第三条开始查询,取一条数据,即第三条数据读取,一二条跳过

(2)是从数据库中的第二条数据开始查询两条数据,即第二条和第三条。

mysql条件关键字查询有limt_MySQL使用Limit关键字限制查询结果的数量-Go语言中文社区...相关推荐

  1. go mysql 查询语句_01 MySQL-初识MySQL-查询语句的执行流程-Go语言中文社区

    MySQL的基础架构 我们通过一条查询语句来看看MySQL是如何执行的,同时通过这条语句的执行,了解MySQL的整体架构体系.mysql> select * from T where ID=1: ...

  2. mysql实现自增字符串_Mysql实现字符串主键自增示例教程-Go语言中文社区

    /* Mysql数据库练习 需求:创建一张表,包含四个字段(pid,name,age,sex),然后使用存储过程实现添加数据,要求 1 pid 为自增主键 2 插入数据的时候值添加姓名和年龄 3 性别 ...

  3. go mysql 查询数据_MySQL常用语句之查询数据-Go语言中文社区

    简单查询: select [distinct] *| {字段名1,字段名2,字段名3, ...} from 表名 [where 条件表达式1] [group by 字段名 [having 条件表达式2 ...

  4. MySQL非分片字段查询_Mycat从入门到放弃-Go语言中文社区

    当初写这篇文章的初衷只是想提醒自己在用一个开源产品前不仅要了解其提供的功能,更要了解其功能和场景边界. 1.非分片字段查询 Mycat中的路由结果是通过分片字段和分片方法来确定的.例如下图中的一个My ...

  5. mysql支持多语言_多种语言连接MySQL-Go语言中文社区

    1.java连接MySQL(JDBC) package Abc; import java.sql.*; public class DBConnection{ public static void ma ...

  6. go连接mysql集群_Mysql集群方案-Go语言中文社区

    MySql集群原理 比如有三台mysql,当java使用数据源连接池进行连接的时候,应该连接哪台呢?其实连接哪台都不行,万一你连接的mysql,突然宕机了,那么数据都查询不到了,其实应该连接mycat ...

  7. mysql为什么选innodb_为什么现在的MySQL都要使用innoDB引擎-Go语言中文社区

    1.MyISAM MyISAM是mysql5.1及之前版本的默认引擎,很久未被更新. 使用表级锁, 如果数据量大,一个插入操作锁定表后,其他请求都将阻塞. 支持全文索引 支持查询缓存保存表的总行数,使 ...

  8. 下载好了mysql 如何在命令行测试_MAC上安装MySQL,测试是否安装好了,在命令窗中作建表、查询等基本操作。-Go语言中文社区...

    一.下载MySQL 在官方网站上下载MySQL 二.安装MySQL 下载好安装包后根据提示进行安装,需要注意的是会提示安装成功以及初始密码,初始密码后续会用到. 三.运行MySQL 打开[系统偏好设置 ...

  9. go MySQL 多语句_八、MySQL经典查询语句-Go语言中文社区

    student表 course表 score表 teacher表 1. 查询Student表中的所有记录的Sname.Ssex和Class列. select Sname,Ssex,Class from ...

最新文章

  1. try-catch-finally中的4个巨坑,老程序员也搞不定!
  2. 公司GitHub被封号,只因员工在伊朗开电脑,官方:将撤销被美制裁国家限制
  3. php sort 不同类型导致的问题
  4. flex的enter_frame事件详解
  5. EMC测试仪器_电巢学堂:单片机系统EMC测试和故障排除
  6. 关于C中字符串的输入和输出使用的函数不同所造成的影响
  7. 正则表达式去除连续重复的字符
  8. python 简单的接口测试框架
  9. java课程设计代码_java(课程设计之记事本界面部分代码公布)
  10. c语言入门经典必备代码
  11. 【python爬虫】《中华诗词大会》诗词接龙代码实现
  12. 基于Pytorch的YoLoV4模型代码及作品欣赏
  13. 文件被后台程序占用无法删除_Windows系统中,教你彻底删除C盘的顽固文件,瞬间多出10个G...
  14. 中国邮箱品牌使用情况调研——TOM邮箱
  15. [科研]本科生毕业论文查重网站汇总
  16. Python让Excel飞起来—模块
  17. leetcode253
  18. 有一种异性朋友叫温暖
  19. “百度杯”CTF比赛 十月场 - 考眼力
  20. PC软件问题【微信多开】【Beyond Compare 4 试用期过的解决办法】【搜狗输入法配置时间输入格式】【win10设置登录界面名称】[Syncovery忽略选项][电脑共享配置登陆密码]

热门文章

  1. 每次运行项目都会出现这个reload script assemblies
  2. 【课程学习】(中国大学MOOC)武汉理工大学高级人工智能原理与技术课后习题笔记(1-5章)
  3. cisco VoIP软电话配置实验
  4. 会议OA之会议排座送审
  5. 张德芬 如何自我成长
  6. MD5文件加密和解密
  7. linux下tar命令解压缩,tar解压缩命令 Linux下的tar压缩解压缩命令详解
  8. 如何在Oracle中检测和修复块损坏
  9. 大数据常用的开发工具
  10. 2018 icpc 焦作站 自闭记