迅闻网
让更多人看到你

mysql分页的几种方式(mysql分页limit用法)

  mysql分页的几种方式

MySQL的分页好像一直是个问题,有什么优化Mysql分页办法吗?下面总结了一些Mysql分页办法,大家一起来看看。
办法1:直接运用数据库提供的SQL句子
句子款式:MySQL中,可用如下办法:SELECT*FROM表称号LIMITM,N。
习惯场景:适用于数据量较少的状况(元组百/千级)。
原因/缺点:全表扫描,速度会很慢且有的数据库结果集回来不安稳(如某次回来1,2,3,另外的一次回来2,1,3)。Limit限制的是从结果集的M方位处取出N条输出,其他抛弃。
MySQL分页办法
办法2:建立主键或仅有索引,运用索引(假定每页10条)
句子款式:MySQL中,可用如下办法:
代码如下:
SELECT*FROM表称号WHEREid_pk>(pageNum*10)LIMITM。
习惯场景:适用于数据量多的状况(元组数上万)。
原因:索引扫描,速度会很快。有朋友提出由于数据查询出来并不是按照pk_id排序的,所以会有漏掉数据的状况,只能办法3。
办法3:根据索引再排序
句子款式:MySQL中,可用如下办法:SELECT*FROM表称号WHEREid_pk>(pageNum*10)ORDERBYid_pkASCLIMITM。
习惯场景:适用于数据量多的状况(元组数上万).最好ORDERBY后的列对象是主键或仅有所以,使得ORDERBY操作能运用索引被消除但结果集是安稳的(安稳的意义,拜见办法1)。
原因:索引扫描,速度会很快.但MySQL的排序操作,只要ASC没有DESC(DESC是假的,未来会做真正的DESC,等待)。
MySQL分页8种办法
办法4:根据索引运用prepare(第一个问号表明pageNum,第二个表明每页元组数)
句子款式:MySQL中,可用如下办法:
代码如下:
PREPAREstmt_nameFROMSELECT*FROM表称号WHEREid_pk>(?*?)ORDERBYid_pk
ASCLIMITM。
习惯场景:大数据量。
原因:索引扫描,速度会很快.prepare句子又比一般的查询句子快一点。
办法5:运用MySQL支撑ORDER操作能够运用索引快速定位部分元组,避免全表扫描。
比方:读第1000到1019行元组(pk是主键/仅有键)。
代码如下:
SELECT*FROMyour_tableWHEREpk>=1000ORDERBYpkASCLIMIT0,20。
办法6:运用”子查询/衔接+索引”快速定位元组的方位,然后再读取元组.道理同办法5
如(id是主键/仅有键,蓝色字体时变量):
运用子查询示例:
代码如下:
SELECT*FROMyour_tableWHEREid<=
(SELECTidFROMyour_tableORDER
BYiddescLIMIT($page-1)*$pagesizeORDERBYiddesc
LIMIT$pagesize
运用衔接示例:
代码如下:
SELECT*FROMyour_tableASt1
JOIN(SELECTidFROMyour_tableORDERBY
iddescLIMIT($page-1)*$pagesizeASt2
WHERE
t1.id<=t2.idORDERBYt1.iddescLIMIT$pagesize;
MySQL分页
办法7:存储过程类(最好交融上述办法5/6)
句子款式:不再给出。
习惯场景:大数据量,推荐的办法。
原因:把操作封装在服务器,相对更快一些。
办法8:反面办法
网上有人写运用SQL_CALC_FOUND_ROWS。没有道理,勿仿照。
基本上,能够推行到所有数据库,道理是一样的。但办法5未必能推行到其他数据库,推行的前提是,其他数据库支撑ORDERBY操作能够运用索引直接完成排序。

mysql

mysql分页limit用法

在讲解limit之间,咱们先说说分页的事情。分页有逻辑分页和物理分页,就像删去有逻辑删去和物理删去。逻辑删去便是改变数据库的状况,物理删去便是直接删去数据库的记载,而逻辑删去只是改变该数据库的状况。例如
为什么逻辑分页占用较大的内存空间,比如我有一张表,表的信息是:
——————————–Tablestructureforvote_record_memory——————————DROPTABLEIFEXISTS`vote_record_memory`;CREATETABLE`vote_record_memory`(`id`int(11)NOTNULLAUTO_INCREMENT,`user_id`varchar(20)NOTNULL,`vote_id`int(11)NOTNULL,`group_id`int(11)NOTNULL,`create_time`datetimeNOTNULL,PRIMARYKEY(`id`),KEY`index_id`(`user_id`)USINGHASH)ENGINE=MEMORYAUTO_INCREMENT=3000001DEFAULTCHARSET=utf8;
向该表中刺进300万条数据后,再转储到桌面,查看转储后的SQL文件的特点:
这是多么庞大的数据,占用的内存多么可怕,为什么咱们再选用数据库。这也是咱们运用云服务器时,设定mysql的存储空间的巨细。
咱们一般不引荐运用逻辑分页,而运用物理分页。在运用物理分页的时分,就要考虑到limit的用法。
解释limit
limitX,Y,越过前X条数据,读取Y条数据
X表明第一个回来记载行的偏移量,Y表明回来记载行的最大数目
假如X为0的话,即limit0,Y,相当于limitY、
经过事务剖析limit
我有一张薪酬表,只显现最新的_前两条记载_,一起进行职工姓名和薪酬提成备注查询
SELECTcue.real_nameempName,zs.push_moneyASpushMoney,zs.push_money_noteASpushMoneyNote,zs.create_datetimeAScreateTimeFROMzq_salaryzs//主表LEFTJOINcore_user_extcueONcue.id=zs.user_id//从表on之后是从表的条件WHEREzs.is_deleted=0AND(cue.real_nameLIKE’%李%’ORzs.push_money_noteLIKE’%测%’)ORDERBYzs.create_datetimeDESCLIMIT2;就相当于ORDERBYzs.create_datetimeDESCLIMIT0,2;
limit的功率问题
我有一个需求,便是从vote_record_memory表中查出3600000到3800000的数据,此时在id上加个索引,索引的类型是Normal,索引的办法是BTREE,分别用两种办法查询
–办法1SELECT*FROMvote_record_memoryvrmLIMIT3600000,20000;–办法2SELECT*FROMvote_record_memoryvrmWHEREvrm.id>=3600000LIMIT20000
你会发现,办法2的履行功率远比办法1的履行功率高,几乎是办法1的九分之一的时刻。
为什么办法1的功率低,而办法二的功率高呢?
剖析一、
由于在办法1中,咱们运用的单纯的limit。limit随着行偏移量的增大,当大到一定程度后,会呈现功率下降。而办法2用上索引加where和limit,性能根本安稳,受偏移量和行数的影响不大。
剖析二、
咱们用explain来剖析
可见,limit句子的履行功率未必很高,由于会进行全表扫描,这便是为什么办法1扫描的的行数是400万行的原因。办法2的扫描行数是47945行,这也是为什么办法2履行功率高的原因。咱们尽量避免全表扫描查询,尤其是数据非常庞大,这张表仅有400万条数据,办法1和办法就有这么大差距,可想而知上千万条的数据呢。
能用索引的尽量运用索引,type至少到达range等级_,这不是我说的,这是阿里巴巴开发手册的5.2.8中要求的_
我不用索引查询到的结果和回来的时刻和办法1的时刻差不多:
SELECT*FROMvote_record_memoryvrmWHEREvrm.id>=3600000LIMIT
20000受影响的行:0时刻:0.196s
这也便是咱们为什么尽量运用索引的原因。mysql索引办法一般有BTREE索引和HASH索引,hash索引的功率比BTREE索引的功率高,但咱们常常运用BTREE索引,而不是hash索引。由于最重要的一点便是:Hash索引仅仅能满足”=”,”IN”和”<=>”查询,不能运用规模查询。
假如是规模查询,咱们为什么用BTREE索引的原因。BTREE索引便是二叉树索引,学过数据结构的应该都清楚,这里就不赘述了。
limit物理分页
咱们都知道limit一般有两个参数,X和Y,X表明越过X个数据,读取Y个数据,咱们就此来查询数据
假如是SQL句子来进行分页的话,咱们可以看到的是:
–主页SELECT*fromvote_record_memoryLIMIT0,20;–第二页SELECT*fromvote_record_memoryLIMIT20,20;–第三页SELECT*fromvote_record_memoryLIMIT40,20;–第四页SELECT*fromvote_record_memoryLIMIT60,20;–n页SELECT*fromvote_record_memoryLIMIT(n-1)*20,20;
因此,假如是用java的话,咱们就可以写一个办法,有两个参数,一个是页数,一个每页显现的行数
/***@description简略的模拟分页雏形*@authorzby*@paramcurrentPage当前页*@paramlines每页显现的多少条*@return数据的集合*/publicList<Object>listObjects(intcurrentPage,intlines){Stringsql=”SELECT*fromvote_record_memoryLIMIT”+(currentPage-1)*lines+”,”+lines;returnnull;}

未经允许不得转载:迅闻网 » mysql分页的几种方式(mysql分页limit用法)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

迅闻网-让更多人看到你

登录/注册返回首页