MySQL大資料LIMIT優化

2021-08-08 16:53:04 字數 2050 閱讀 8360

問題: 專案每日遊戲日誌表資料量由原來1w+增長到千萬級別,原先獲取資料方式:

select 

*from table

一次性取出的資料量太大導致記憶體溢位。既然一次性取資料不行,那就分次處理~

1-1. 使用limit每次取5w條資料

select 

*from table limit 0,

50000

select

*from table limit

50000

,50000

...

重新跑了**,速度很慢,可能是處理資料耗時過長,資料表內有一大部分是此處無用的重複資料,從這入手~

1-2. 根據專案情況通過select distinct減少得到的資料量

加上索引後速度不錯,但是index_length大約是data_length的75%左右。

索引佔了太大空間,只能另想他法 ╮(╯▽╰)╭

發現乙個奇怪現象:

select 

*from table limit 0,

50000

#速度很快

select

*from table limit

5000000

,50000

#速度很慢

此表有自增id主鍵,所以使用where條件可以順利解決~

1-3. 通過where條件按自增id取資料

select 

*from table where id

>

0and id

<=

50000

select

*from table where id

>

50000

and id

<=

100000

...

搞定~ 但是還有乙個模組需要使用其它查詢條件,最終結果id不連續,得另想個辦法。

基於:

select 

*from table limit

5000000,1

#速度相對較快

select

*from table limit

5000000

,50000

#速度很慢

2-1. 先取第一條id 再通過id與limit取資料

select 

*from table where condition and id

>=

(select id from table whrer condition limit

5000000,1

)limit

50000

速度提公升,但不理想。

2-2. 先通過子查詢取出id 再通過id取資料

select 

*from table where id in

(select id from

(select id from table where condition limit

5000000

,50000

)as tmp

)

先通過主鍵索引找出id,再通過id取資料,測試結果不理想,但是sql和子查詢分開執行,速度ok。

2-3. 拆分成兩次執行 先取出id 再通過id取資料

select id from table where condition 

#先取出並處理id

select

*from table where id in

(5000001

,5000002

,5000003

,...)

速度可以接受,使用其它條件不通過索引查詢速度相對還會慢一些,模組內每個欄位都可以作為組合查詢條件,所以沒加索引,在專案頁面上增加先縮小資料範圍再查詢的提示,搞定~

MySQL大資料下Limit使用

對於一直用oracle的我,今天可是非常詫異,mysql中同乙個函式在不同數量級上的效能居然差距如此之大。先看錶ibmng id,title,info 唯一 id key 索引title 先看看兩條語句 select from ibmng limit 1000000,10 select from i...

MySQL大資料下Limit使用

對於一直用oracle的我,今天可是非常詫異,mysql中同乙個函式在不同數量級上的效能居然差距如此之大。先看錶ibmng id,title,info 唯一 id key 索引title 先看看兩條語句 select from ibmng limit 1000000,10 select from i...

mysql做好Limit優化

使用mysql時,往往需要指定返回幾行資料,此時可以使用limit關鍵字來實現這個需求。limit子句可以被用於強制select查詢語句返回指定的記錄數量。通常情況下,limit關鍵字可以接受乙個或者兩個數字引數。需要注意的是,這個引數必須是乙個整數常量。如果使用者給定兩個引數,則第乙個引數表示第乙...