mysql数据库分页查询sql语句(mysql的分页查询语句)
今天给各位分享关于mysql的分页查询语句(mysql数据库分页查询sql语句)的知识,希望对你有帮助,现在开始把!
1、序当表中有上万条记录需要从数据库中查询时,一次性查询全部结果会非常慢,特别是随着数据量的增加,需要分页查询。数据库分页查询也有很多 *** 和优化点。简单说一下我知道的一些 *** 。
2、准备工作/即将开始工作为了测试下面列出的一些优化,下面是对一个现有表的描述。表名:order_history描述:某个业务的订单历史表主要字段:unsignedintid,tinyint(4)inttype字段情况:该表一共37个字段,不包含text等大型数据,更大为varchar(500),id字段为索引,且为递增。数据量:5709294MySQL版本:16线下找百万级测试台不容易。
3、如果需要自己测试,可以写个shell脚本什么的插入数据进行测试。的所有sql语句的执行环境都没有改变。以下是基本的测试结果:selectcount(*)fromorders_history;结果:5709294三个查询时间是:8903ms8323ms8401ms通用分页查询利用简单的limit子句可以实现一般的分页查询。
4、limit子句声明如下:SELECT*FROMtableLIMIT[offset,]rows|rowsOFFSEToffsetLIMIT子句可用于指定SELECT语句返回的记录数。请注意以下几点:之一个参数指定之一个返回记录行的偏移量第二个参数指定返回记录行的更大数目如果只给定一个参数:它表示返回更大的记录行数目第二个参数为-1表示检索从某一个偏移量到记录集的结束所有的记录行初始记录行的偏移量是0(而不是1)下面是一个应用示例:select*fromorders_historywheretype=8limit1000,10;该语句将查询orders_history表中第1000条数据之后的10条数据,即第1001条到第10010条数据。默认情况下,数据表中的记录使用主键(通常是id)进行排序。
5、上述结果相当于:select*fromorders_historywheretype=8orderbyidlimit10000,10;三个查询时间是:3040毫秒3063毫秒3018毫秒针对这种查询方式,下面测试查询记录对时间的影响:select*fromorders_historywheretype=8limit10000,1;select*fromorders_historywheretype=8limit10000,10;select*fromorders_historywheretype=8limit10000,100;select*fromorders_historywheretype=8limit10000,1000;select*fromorders_historywheretype=8limit10000,10000;三个查询时间如下:1条记录:3072ms3092ms3002ms,10条记录:3081ms3077ms3032ms,100条记录:3118ms3200ms3128ms,1000条记录:3412ms3468ms3394ms,10000条记录:3749ms3802ms3696ms另外,我做了十几个查询。从查询时间上,基本可以确定当查询记录数小于100时,查询时间基本没有差别。随着查询记录越来越多,花费的时间也会越来越多。
6、测试查询偏移量:select*fromorders_historywheretype=8limit100,100;select*fromorders_historywheretype=8limit1000,100;select*fromorders_historywheretype=8limit10000,100;select*fromorders_historywheretype=8limit100000,100;select*fromorders_historywheretype=8limit1000000,100;三个查询时间如下:查询100偏移量:25ms24ms24ms查询1000偏移量:78ms76ms77ms查询10000偏移量:3092ms3212ms3128ms查询10000偏移量:3878ms3812ms3798ms查询100000偏移量:14608ms14062ms14700ms随着查询偏移量的增加,特别是查询偏移量超过100,000后,查询时间急剧增加。这种分页查询方式会从数据库中的之一条记录开始扫描,所以越往后,查询速度越慢,查询的数据越多,总的查询速度越慢。
7、使用子查询优化该 *** 首先定位偏移位置的id,然后再查询它。
8、这种 *** 适用于id增加的情况。select*fromorders_historywheretype=8limit100000,1;selectidfromorders_historywheretype=8limit100000,1;select*fromorders_historywheretype=8andid>=(selectidfromorders_historywheretype=8limit100000,1)limit100;select*fromorders_historywheretype=8limit100000,100;四条语句的查询时间如下:之一条语句:3674ms,第二条语句:1315ms,第三条语句:1327ms,第四条语句:3710ms。应该注意上面的查询:比较第1条语句和第2条语句:使用selectid代替select*速度增加了3倍比较第2条语句和第3条语句:速度相差几十毫秒比较第3条语句和第4条语句:得益于selectid速度增加,第3条语句查询速度增加了3倍与原来的通用查询 *** 相比,这种 *** 会快几倍。
9、使用id来限定优化这种 *** 假设数据表的id是不断增加的,那么我们就可以根据查询的页数和记录数来计算查询的id的范围,我们可以使用idbetween和to来查询:select*fromorders_historywheretype=2andidbetween1000000and1000100limit100;查询时间:15毫秒12毫秒9毫秒这种查询方式可以大大优化查询速度,基本可以在几十毫秒内完成。该限制只能在id明确的情况下使用。但是基本id字段通常是在创建表的时候添加的,这给分页查询带来了很多方便。
10、还有另一种写法:select*fromorders_historywhereid>=1000001limit100;当然,也可以使用in *** 进行查询。当多个表关联时,通常使用此 *** 进行查询,并使用其他表的id集进行查询:select*fromorders_historywhereidin(selectorder_idfromtrade_2wheregoods='pen')limit100;注意,有些mysql版本不支持在in子句中使用limit。
11、使用临时表优化这个 *** 不再是查询优化的一部分,这里提到它。
12、对于用id限制优化的问题,需要不断增加id。但是,在某些情况下,例如当使用历史表时,或者当数据丢失时,可以考虑使用临时存储的表来记录分页id,并在查询中使用分页id。这样可以大大提高传统分页查询的速度,尤其是在数据量数千万的情况下。
13、关于数据表的id描述一般情况下,在数据库中创建表时,强制为每个表添加一个id增量字段,方便查询。如果订单库等数据量非常大,通常会分为库和表。此时,不建议使用数据库的id作为唯一id。
14、相反,应该使用分布式高并发唯一ID生成器来生成它,并且应该在数据表中使用另一个字段来存储这个唯一ID。先用范围查询定位id(或索引),再用索引定位数据,可以提高几倍的查询速度。
mysql的分页查询语句(mysql数据库分页查询sql语句)的介绍就到这里,感觉你的阅读!
本文内容由互联网用户自发贡献,该文观点仅代表作者本人。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 203304862@qq.com
本文链接:https://jinnalai.com/wenda/215206.html