問題: 專案每日遊戲日誌表資料量由原來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關鍵字可以接受乙個或者兩個數字引數。需要注意的是,這個引數必須是乙個整數常量。如果使用者給定兩個引數,則第乙個引數表示第乙...