大发体育娱乐在线-大发体育娱乐官方网站-大发体育娱乐登录网址
做最好的网站

MySQL高效分页解决方案集分享

来源:http://www.dfwstonefabricators.com 作者:大发体育网络 人气:194 发布时间:2019-12-11
摘要:生机勃勃,最听而不闻MYSQL最主旨的分页方式: 复制代码 代码如下: select * from content order by id desc limit 0, 10 在中等数据量的情形下,那样的SQL丰盛用了,唯意气风发必要注意的主题素材

生机勃勃,最听而不闻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(卡塔尔(英语:State of Qatar)函数结合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(卡塔尔(英语:State of Qatar) 则取到了这些纪录。 即使也是五个语句,但是只进行了一次主查询,所以成效比原先要高超级多。
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;

复制代码 代码如下: select * from content order by id desc limit 0, 10 在中等数据量的状态下,那样的SQL丰硕用了...

本文由大发体育娱乐在线发布于大发体育网络,转载请注明出处:MySQL高效分页解决方案集分享

关键词:

最火资讯