Mysql学习MySQL高效分页解决方案集分享

Mysql学习MySQL高效分页解决方案集分享,第1张

概述介绍《Mysql学习MySQL高效分页解决方案分享》开发教程,希望对您有用。

《MysqL学习MysqL高效分页解决方案集分享》要点:
本文介绍了MysqL学习MysqL高效分页解决方案集分享,希望对您有用。如果有疑问,可以联系我们。

一,最常见MysqL最基本的分页方式:
代码如下:
select * from content order by ID desc limit 0,10

在中小数据量的情况下,这样的sql足够用了,唯一需要注意的问题就是确保使用了索引.随着数据量的增加,页数会越来越多,查看后几页的sql就可能类似:
代码如下:
select * from content order by ID desc limit 10000,10

一言以蔽之,就是越往后分页,liMIT语句的偏移量就会越大,速度也会明显变慢.
此时,我们可以通过2种方式:
一,子查询的分页方式来提高分页效率,飘易用的SQL语句如下:
代码如下:
SELECT * FROM `content` WHERE ID (SELECT ID FROM `content` ORDER BY ID desc liMIT ".($page-1)*$pagesize.",1) ORDER BY ID desc liMIT $pagesize

为什么会这样呢?因为子查询是在索引上完成的,而普通的查询时在数据文件上完成的,通常来说,索引文件要比数据文件小得多,所以 *** 作起来也会更有效率.(via)通过explain SQL语句发现:子查询使用了索引!
代码如下:
ID select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY content range PRIMARY PRIMARY 4 NulL 6264 Using where
2 SUBquery content index NulL PRIMARY 4 NulL 27085 Using index

经过飘易的实测,使用子查询的分页方式的效率比纯liMIT提高了14-20倍!
二,JOIN分页方式
代码如下:
select * FROM `content` AS t1
JOIN (SELECT ID FROM `content` ORDER BY ID desc liMIT ".($page-1)*$pagesize.",1) AS t2
WHERE t1.ID

经过我的测试,join分页和子查询分页的效率基本在一个等级上,消耗的时间也基本一致.explain SQL语句:
代码如下:
ID select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY system NulL NulL NulL NulL 1
1 PRIMARY t1 range PRIMARY PRIMARY 4 NulL 6264 Using where
2 DERIVED content index NulL PRIMARY 4 NulL 27085 Using index

三,使用MysqL的FOUND_ROWS()函数
MysqL FOUND_ROWS() 函数结合sql_CALC_FOUND_ROWS在SELECT中可以得到两个结果:
1. 得到limit的内容
2. 得到去除limit以后所有行数
SELECT语句中经常可能用liMIT限制返回行数.有时候可能想要知道如果没有liMIT会返回多少行,但又不想再执行一次相同语句.那么,在SELECT查询中包含sql_CALC_FOUND_ROWS选项,然后执行FOUND_ROWS()就可以了:
代码如下:
select sql_CALC_FOUND_ROWS * FROM tbl_name WHERE ID > 100 liMIT 10;
SELECT FOUND_ROWS();

其中sql_CALC_FOUND_ROWS 告诉MysqL将sql所处理的行数记录下来,FOUND_ROWS() 则取到了这个纪录. 虽然也是两个语句,但是只执行了一次主查询,所以效率比原来要高很多.
1. 如果在前一条语句中使用sql_CALC_FOUND_ROWS选项,FOUND_ROWS()将返回第一条语句没有liMIT时返回的行数.
2. 如果在前一条语句中没有使用sql_CALC_FOUND_ROWS选项,FOUND_ROWS()将返回前一条语句实际返回的行数.
如果使用 SELECT sql_CALC_FOUND_ROWS,MysqL必须计算所有结果集的行数.尽管这样,总比再执行一次不使用liMIT的查询要快多了吧,因为那样结果集要返回客户端滴.(另外:应该不单是没有将结果集返回的原因,还有原因可能是比如liKE之类比较费劲的sql不需要再去劳累一次.)
代码如下:
-- 注意下面语句中的条件 liKE
SELECT sql_CALC_FOUND_ROWS * FROM tbl_name WHERE name liKE '%string%' ID > 100 liMIT 10;
SELECT FOUND_ROWS();

代码如下:
-- 上面语句等价于下面语句,但性能方面应该提升非常非常的明显:
SELECT COUNT(*) FROM tbl_name WHERE name liKE '%string%' ;
SELECT * FROM tbl_name WHERE name liKE '%string%' ID > 100 liMIT 10;
总结

以上是内存溢出为你收集整理的Mysql学习MySQL高效分页解决方案集分享全部内容,希望文章能够帮你解决Mysql学习MySQL高效分页解决方案集分享所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1160832.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存