Mysql排行榜使用频繁

时间:2015-02-17 17:52:18

标签: mysql query-optimization leaderboard

我有一堆移动应用程序将数据发送到mysql服务器。每个应用程序都有自己的表格,只需几周就可轻松达到100,000条记录。我目前每天有大约1000万次调用数据库。我的系统当前设置的方式是每5分钟一个cron将为每个表运行一堆查询并将html缓存到文件中。然后当用户调用排行榜时,我运行1个查询来获取他们当前的排名,然后我显示缓存的html以及他从查询中提取的排名。

虽然这有效,但我希望改变这一点有两个主要原因。我想在客户端而不是在我的服务器上为排行榜提供服务。我想发送json,然后在他们的设备上解析它。此外,我想为每个应用添加每日,每周,每月和所有时间排行榜。目前,我存储数据的方式不允许这样做。

我的问题是

  1. 将json发送给用户的最佳方法是什么?将json像我在文件中的html一样缓存然后让用户调用该文件是明智的吗?唯一的抱怨是,我需要为每个应用程序创建4个json文件(每日,每周,每月,所有时间)。

  2. 想要添加每日,每周,每月和所有时间分数的数据库结构是什么样的?我已经为我的一些应用程序添加了每日分数,但我停止了这样做,因为这似乎是一种可怕的方式。我基本上保留了所有用户的大量列表以及他们今天开始的内容,每次他们更新他们的分数时,我会将其与他们存储的分数进行比较并获得差异。如果我每周和每月都有数百万条记录,那么这张桌子很快就变得非常大了。

  3. 我的每个应用程序的表格结构非常简单

    CREATE TABLE `app_test1` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `deviceID` varchar(50) NOT NULL,
      `username` varchar(25) NOT NULL,
      `score` int(11) unsigned NOT NULL
      PRIMARY KEY (`id`),
      UNIQUE KEY `deviceID_2` (`deviceID`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;
    

    通常我会根据自己的需要进行更改和调整,但是经过这么多次调用我发现了很多次,一个简单的小改动很容易让服务器崩溃,所以现在我想得到一些想法在我尝试任何事之前。

1 个答案:

答案 0 :(得分:1)

1)无论最好的方法是缓存JSON文件,它都具有与您在HTML中缓存的数据一致的好处。生成JSON可能会重复使用您使用的相同代码(d)与HTML,因此在某种程度上减少了您的工作量。

2)这部分很容易,至少乍看之下:为您为用户注册的每个分数添加时间戳。 确保添加包含时间戳的索引(或更多):您将根据时间执行大量数据操作。

另一种可能性是为每日,每周,每月和所有时间分数设置新表。缺点是这会给你的服务器端代码增加一些复杂性,坦率地说,它有点恶心......但是,你只需要在特定的表上查询相关的高分。因此,如果您保留50个最高分,那么这些表中只有50 x your number of apps行。当用户注册新分数时,您检查它是否高于50中的最低每日分数:在这种情况下,将其插入表中并删除最低分数。如果它超过每日分数,则检查每周分数,如果它每月检查一次,依此类推。 Wehen你插入一个新的高分,重新创建你的缓存高分文件(HTML或JSON)。在一天结束时运行一个cron来清理每日表等。对这些表的读取和写入将比全表搜索更快。

对你来说只是一些想法,我希望我有道理。

编辑:我忘记了另一种可能性,即在不同服务器之间分割数据。例如,拥有服务器1上的游戏A,B和C以及服务器2上的游戏D,E,F和G的数据。这将使您能够更均匀地处理负载。这需要一些摆弄(你不希望服务器接收80%的流量,而另一个只获得剩余的20%),但它是一个简单的解决方案,因为所有的游戏似乎使用相同的架构;缺点是显然维护两台服务器会更加昂贵。