首頁  >  問答  >  主體

mysql优化 - 有关Mysql分表分页问题

我把难题简单归结为,跨多张结构一样的表查数据,怎么去实现分页?

先说下我这边的分表规则吧
这边是一个游戏web后台,现在是对玩家的登陆日志进行分表,分表的规则是按季度分表的,也就是01~03月一张表,04~06月一张表,07~09月一张表,10~12月一张表,
表结构就是这样:

player_login_01_03
player_login_04_06
player_login_07_09 目前这张表没有
player_login_10_12 目前这张表没有

不过现在是07月份,那么实际就是这样:

player_login 这个是原表名
player_login_01_03
player_login_04_06

字段

SQLplayer_id        int             用户ID,主键
player_name      varchar         用户名
last_login_time  datetime        最后登陆时间
.....其他字段

现在表已经分了,不过难题来了,web后台有个功能就是根据player_id和last_login_time来查找玩家信息。
1.时间不夸表的选择:
如果选择的时间段比如是2015-07-01 00:00:00~2015-07-31 23:59:59或者0015-01-01 00:00:00~2015-01-31 23:59:59这样的时间段的话就很好实现分页,因为这个时间段是不需要夸表的,按照现在是7月分就直接对应player_login和player_login_01_03就行了。
2.时间夸多张的选择:
假设选择的时间类似这样的:2015-03-01 00:00:00~2015-04-30 23:59:59
那就需要夸两张表去查询了,有时候可能是更多张表,那用什么方法能实现分页呢?(这个登陆的表一个季度下来数据量很大的,少说每张表也是几百万),我尝试把跨表的数据查询出来用array_slice分,数组过大的时候PHP会提示内存不足的。

PHPzPHPz2764 天前579

全部回覆(3)我來回復

  • 巴扎黑

    巴扎黑2017-04-17 13:08:42

    不太理解為什麼要按最後登入時間分錶,如果同一個使用者在4月份登錄,然後再7月又登入了,這裡的邏輯應該是怎樣的?照我的理解,player_id是主鍵,那你分完表之後仍然需要保證這一點,所以7月份的表中會多一條數據,而4月份的那個數據應該刪掉,但是你的邏輯好像不是這樣,不知道我理解的對不對?一半分錶都是依照主鍵分錶,保證同一個使用者的資料只會落在同一張表中,這樣會不會簡單一些。

    回覆
    0
  • 阿神

    阿神2017-04-17 13:08:42

    例如跨兩張表,如果按時間正序,然後透過計算page,pagesize看需要各從兩張表取多少個資料
    1. 你取得表1、表2在這個時間段內的總數量
    2. 透過page/pagesize計算下需要從表1取得多少條數據,從表2取得多少條數據。

    不過mysql的limit offset比較大的時候好像效率比較低,分頁的話= =

    回覆
    0
  • 巴扎黑

    巴扎黑2017-04-17 13:08:42

    用redis可以嗎,把player_login表所需的資料放在redis裡,查詢條件當作key

    回覆
    0
  • 取消回覆