MySQL开发技巧 - 分页和索引(一)

it2023-11-20  75

@R星校长

第1关:MySQL 分页查询

本关任务:能分页读取表中数据,针对大数据量进行简单优化。

如何根据页数和每页数据量进行分页查询;大数据量级进行优化分页查询。

什么是分页查询

当一个表中有很多符合查询条件的数据的时候,我们往往不需要把他们全部一次性取出来,那样对查询效率或者服务器性能来说都会是一个极大的挑战:例如最简单的商城,假设商城中有一万个数据,但我们在前端可能只会每次看到一页10个左右的数据,当我们浏览完这十个商品后,点击下一页浏览其他的商品,这样的分页浏览,对实际存储商品数据的 MySQL数据库来说,实际上就是使用了 MySQL 的分页查询功能。

那么我们该怎么实现分页查询呢?

limit 和 offset 实现的分页查询

limit在之前的学习中应该有学习到,它可以返回符合条件的limit条数据:

select * from table where xxx="xxx" limit 10;

输出: 检索记录行符合条件的10条数据

那么我们也可以利用limit和offset来进行分页查询:

select * from table where xxx="xxx" limit 10 offset 10;

输出:检索记录行符合条件的11-20条数据

limit之后的数字代表偏移量,offset代表返回记录的最大值,可以通俗的理解为,从table中取出第limit+1行到limit+offset+1行数据( MySQL偏移值从0开始计算)。

在实际使用中,我们可以直接把offset直接省略掉:

select * from table where xxx="xxx" limit 10,10;

该语句效果与带offset实际上是一模一样的。

通过分页查询,我们可以精确的定位到行数直接取出符合条件的多条数据,但是这也同样存在着性能问题。

大数据量下分页查询优化

select * from table where xxx="xxx" limit 100,100; select * from table where xxx="xxx" limit 1000,100; select * from table where xxx="xxx" limit 10000,100; select * from table where xxx="xxx" limit 100000,100; select * from table where xxx="xxx" limit 1000000,100;

以上语句在实际使用中实际上查询速度会是越来越慢的,这是因为分页查询方式会从数据库第一条记录开始扫描,所以越往后,查询速度越慢,而且查询的数据越多,也会拖慢总查询速度。

如果可以直接定位到偏移量所在记录,那么查询速度肯定能得到一个巨大的提升,所以可以考虑添加一个嵌套子查询,先查询到偏移量位置,再进行分页:

select * from table where xxx="xxx" and id>=(select id from table where xxx="xxx"limit 100000,1) limit 100;

编程要求

根据提示,在右侧编辑器补充代码:

按prod_id升序查询表products中第6-10行数据,只要求prod_id字段即可(prod_id从1开始);利用子查询优化查询出按prod_id升序的第10-15行数据,只要求prod_id字段即可。

数据表结构如下:

预期输出:

prod_id 6 7 8 9 10 prod_id 10 11 12 13 14 15

开始你的任务吧,祝你成功!

USE Products; #请在此处添加实现代码 ########## Begin ########## #1.分页查询 select prod_id from products limit 5,5; #2.用子查询优化分页查询语句 select prod_id from products where prod_id >= (select prod_id from products limit 10,1) limit 5; ########## End ########## #! /bin/bash mysql -uroot -p123123 << EDF drop database if exists Products EDF #执行sql语句 mysql -uroot -p123123 << EDF CREATE DATABASE Products; USE Products; create table products( prod_id int PRIMARY KEY, prod_name VARCHAR(30) NOT NULL, prod_price VARCHAR(20) ); insert into products(prod_id,prod_name,prod_price) values (1,"prod","12"),("2","prod","24"),("3","prod","35"),("4","prod","35"),("5","prod","35"),("6","prod","35"),("7","prod","35"),("8","prod","35"),("9","prod","35"),("10","prod","35"),("11","prod","35"),("12","prod","35"),("13","prod","35"),("14","prod","35"),("15","prod","35"),("16","prod","35"),("17","prod","35"),("18","prod","35"); EDF #执行sql文件 mysql -uroot -p123123 < src/step1/step1.sql

最新回复(0)