电玩城打鱼捕鱼-专业24小时上下分

6种分页方法总结,8种MySQL分页方法总结

六月 27th, 2019  |  电玩城上下分数据库

mysql的ORDER BY RAND()优化

概述

电玩城打鱼捕鱼,MySQL的分页似乎一直是个问题,有什么优化方法吗?网上看到网上推荐了一些分页方法,但似乎不太可行,你能点评一下吗?

 

有朋友问: MySQL的分页似乎一直是个问题,有什么优化方法吗?
网上看到赶集网XX推荐了一些分页方法,但似乎不太可行,你能点评一下吗?

方法1: 直接使用数据库提供的SQL语句

我们都知道,mysql里用到ORDER BY
RAND()在数据量比较多的时候是很慢的,因为会导致mysql全表扫描,故也不会用到索引,

方法总结

—语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N。

所以ORDER BY
RAND()用来随机时已经是到禁区里了,所以我们应该尽量避免使用ORDER BY
RAND()才对,所以这个是需要用其他方法替代或者优化才行。

方法1: 直接使用数据库提供的SQL语句

—适应场景: 适用于数据量较少的情况(元组百/千级)。

 

语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N
适应场景: 适用于数据量较少的情况(元组百/千级)
原因/缺点: 全表扫描,速度会很慢 且
有的数据库结果集返回不稳定(如某次返回1,2,3,另外的一次返回2,1,3).
Limit限制的是从结果集的M位置处取出N条输出,其余抛弃.

—原因/缺点: 全表扫描,速度会很慢 且
有的数据库结果集返回不稳定(如某次返回1,2,3,另外的一次返回2,1,3)。Limit限制的是从结果集的M位置处取出N条输出,其余抛弃。

当我们随机一条数据时可以考虑一下:

方法2: 建立主键或唯一索引, 利用索引(假设每页10条)

方法2: 建立主键或唯一索引, 利用索引(假设每页10条)

 

语句样式: MySQL中,可用如下方法: SELECT FROM 表名称 WHERE id_pk >
(pageNum10) LIMIT M
适应场景: 适用于数据量多的情况(元组数上万)
原因: 索引扫描,速度会很快. 有朋友提出:
因为数据查询出来并不是按照pk_id排序的,所以会有漏掉数据的情况,只能方法3

—语句样式: MySQL中,可用如下方法:

[php] 
$DBI=new dbi2($__DBserver);  
$num=$DBI->result('select count(1) as num from article');//获取总条数,数据库引擎为MyISAM采用吧  

$num=$num[0]['num']-1;  
$num=rand(1, $num);  
$list=$DBI->result('SELECT id FROM acticle ORDER BY viewcount DESC LIMIT ?,1',$num);//利用limit  

方法3: 基于索引再排序

复制代码 代码如下:

 

语句样式: MySQL中,可用如下方法: SELECT FROM 表名称 WHERE id_pk >
(pageNum10) ORDER BY id_pk ASC LIMIT M
适应场景: 适用于数据量多的情况(元组数上万). 最好ORDER
BY后的列对象是主键或唯一所以,使得ORDERBY操作能利用索引被消除但结果集是稳定的(稳定的含义,参见方法1)
原因: 索引扫描,速度会很快.
但MySQL的排序操作,只有ASC没有DESC(DESC是假的,未来会做真正的DESC,期待…).

SELECT * FROM 表名称 WHERE id_pk > (pageNum*10) LIMIT M。

 

方法4:
基于索引使用prepare(第一个问号表示pageNum,第二个?表示每页元组数)

语句样式: MySQL中,可用如下方法: PREPARE stmt_name FROM SELECT FROM
表名称 WHERE id_pk > (? ?) ORDER BY id_pk ASC LIMIT M
适应场景: 大数据量
原因: 索引扫描,速度会很快. prepare语句又比一般的查询语句快一点。

—适应场景: 适用于数据量多的情况(元组数上万)。

随机多条数据时,为了避免全表扫描,可以取出一小部分在随机,这个随机性会落在一个小范围内:

方法5: 存储过程类(最好融合上述方法4)

—原因:
索引扫描,速度会很快。有朋友提出因为数据查询出来并不是按照pk_id排序的,所以会有漏掉数据的情况,只能方法3。

 

语句样式: 不再给出
适应场景: 大数据量. 作者推荐的方法
原因: 把操作封装在服务器,相对更快一些。

方法3: 基于索引再排序

[php] 
$DBI=new dbi2($__DBserver);  
//在200条范围内取10条随机  
$list=$DBI->result('SELECT id FROM (SELECT id FROM acticle ORDER BY viewcount DESC LIMIT ?)X ORDER BY RAND() LIMIT ?',200,10);  

方法6: 反面方法

—语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 WHERE id_pk
> (pageNum*10) ORDER BY id_pk ASC LIMIT M。

 

网上有人写使用 SQL_CALC_FOUND_ROWS。 没有道理,勿模仿

—适应场景: 适用于数据量多的情况(元组数上万). 最好ORDER 
BY后的列对象是主键或唯一所以,使得ORDERBY操作能利用索引被消除但结果集是稳定的(稳定的含义,参见方法1)。

标签:

Your Comments

近期评论

    功能


    网站地图xml地图