大多數(shù)人跟我一樣琳钉,最開(kāi)始接觸PageHelper的時(shí)候,都被超級(jí)方便的分頁(yè)操作吸引
有多方便蛛倦?
public PageInfo querySharePage(QueryObject qo) {
PageHelper.startPage(qo.getCurrentPage(), qo.getPageSize());
List<ShareTrainHh> shareList = trainHhMapper.selectAll();
return new PageInfo(shareList);
}
一個(gè)普通的分頁(yè)功能歌懒,從頭到尾只需要三句代碼
但是!
數(shù)據(jù)量大一點(diǎn)的表溯壶,千萬(wàn)不要隨便拿來(lái)就用及皂!
舉例:
1. MySql的order by和limit一起使用時(shí)的BUG
select * from table_a where user_id = xx order by gmt_create desc limit xx
這樣的話,即使user_id加了索引且改,但還是會(huì)非常非常慢验烧,關(guān)于這個(gè)問(wèn)題的細(xì)節(jié)自行百度。
這個(gè)問(wèn)題能不能解決又跛?可以碍拆。而且不難
select * from
(
select * from table_a where user_id = xx order by gmt_create desc
) a
limit xx
像這樣在外層套一個(gè)查詢,把order by和limit分開(kāi)就可以解決慨蓝。
但是感混!
因?yàn)椴寮亲约涸趕ql后面拼的limit,我們沒(méi)辦法控制礼烈,所以此問(wèn)題無(wú)解弧满。
2. 數(shù)據(jù)量過(guò)大時(shí) limit分頁(yè)效率
當(dāng)數(shù)據(jù)量大到一定量級(jí)后,比如有幾個(gè)text字段的大表100萬(wàn)條數(shù)據(jù)的時(shí)候
這個(gè)時(shí)候執(zhí)行sql
select * from table_a limit 800000,10
只查了10條數(shù)據(jù)此熬,但是非常非常慢!
因?yàn)楦鶕?jù)limit的執(zhí)行原理庭呜,這里是查出前80W+10條數(shù)據(jù),然后截掉前面的80W條數(shù)據(jù)犀忱。
這個(gè)問(wèn)題能不能解決募谎?也可以。
select * from trable_a
where id in
(
select id from trable_a limit 800000,10
) a
像這樣先利用主鍵索引確定id的范圍阴汇,再去查詢具體數(shù)據(jù)就可以数冬。
但是!
因?yàn)椴寮亲约涸趕ql后面拼的limit鲫寄,我們沒(méi)辦法控制吉执,所以此問(wèn)題無(wú)解疯淫。