国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

淺談MySQL分頁Limit的性能問題

2020-01-18 20:43:44
字體:
供稿:網(wǎng)友

MySQL的分頁查詢通常通過limit來實現(xiàn)。limit接收1或2個整數(shù)型參數(shù),如果是2個參數(shù),第一個是指定第一個返回記錄行的偏移量,第二個是返回記錄行的最大數(shù)目。初始記錄行的偏移量是0。為了與PostgreSQL兼容,limit也支持limit # offset #。

問題:

對于小的偏移量,直接使用limit來查詢沒有什么問題,但隨著數(shù)據(jù)量的增大,越往后分頁,limit語句的偏移量就會越大,速度也會明顯變慢。

優(yōu)化思想:避免數(shù)據(jù)量大時掃描過多的記錄

解決:子查詢的分頁方式或者JOIN分頁方式。JOIN分頁和子查詢分頁的效率基本在一個等級上,消耗的時間也基本一致。

下面舉個例子。一般MySQL的主鍵是自增的數(shù)字類型,這種情況下可以使用下面的方式進行優(yōu)化。

以真實的生產(chǎn)環(huán)境的6萬條數(shù)據(jù)的一張表為例,比較一下優(yōu)化前后的查詢耗時:

-- 傳統(tǒng)limit,文件掃描[SQL]SELECT * FROM tableName ORDER BY id LIMIT 50000,2;受影響的行: 0時間: 0.171s-- 子查詢方式,索引掃描[SQL]SELECT * FROM tableNameWHERE id >= (SELECT id FROM tableName ORDER BY id LIMIT 50000 , 1)LIMIT 2;受影響的行: 0時間: 0.035s-- JOIN分頁方式[SQL]SELECT * FROM tableName AS t1JOIN (SELECT id FROM tableName ORDER BY id LIMIT 50000, 1) AS t2WHERE t1.id <= t2.id ORDER BY t1.id LIMIT 2;受影響的行: 0時間: 0.036s

可以看到經(jīng)過優(yōu)化性能提高了很多倍。

優(yōu)化原理:

子查詢是在索引上完成的,而普通的查詢時在數(shù)據(jù)文件上完成的。通常來說,索引文件要比數(shù)據(jù)文件小得多,所以操作起來也會更有效率。因為要取出所有字段內(nèi)容,第一種需要跨越大量數(shù)據(jù)塊并取出,而第二種基本通過直接根據(jù)索引字段定位后,才取出相應(yīng)內(nèi)容,效率自然大大提升。因此,對limit的優(yōu)化,不是直接使用limit,而是首先獲取到offset的id,然后直接使用limit size來獲取數(shù)據(jù)。

在實際項目使用,可以利用類似策略模式的方式去處理分頁。例如,每頁100條數(shù)據(jù),判斷如果是100頁以內(nèi),就使用最基本的分頁方式;如果大于100,則使用子查詢的分頁方式。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 年辖:市辖区| 霸州市| 彭州市| 三台县| 嘉荫县| 潼南县| 深水埗区| 宜川县| 丹江口市| 崇左市| 喀什市| 天津市| 都安| 鸡西市| 衡水市| 大同县| 张北县| 同仁县| 凉城县| 台东县| 和平县| 南陵县| 门头沟区| 崇州市| 射洪县| 普格县| 永新县| 衡东县| 临西县| 苍南县| 姜堰市| 柏乡县| 绥德县| 浮梁县| 铜山县| 濮阳市| 攀枝花市| 莎车县| 原阳县| 星座| 吕梁市|