文档章节

百万级SQL查询优化

梦想游戏人
 梦想游戏人
发布于 2018/01/07 14:50
字数 942
阅读 67
收藏 4

地图信息,需要保存在服务器,redis来做这个工作的话 不太合适,第一数据量太大,第二大部分是冷数据,,,虽然排序用redis来做方便的多,但是还是倾向于mysql。

功能:

1.玩家可以任意创作地图,记录相关信息比如,id ,创建者id,时间戳,鸡蛋数量,鲜花数量。等

2.玩家可以查看已存在的地图,类似于留言板,供玩家浏览(大量的查询,动态加载查询)

3.每天挑选出地图好评数最多的50个,加入自定义地图。(类似于LOL的每周免费英雄)所有玩家的地图=官方地图+自定义地图。

-----------------------------------------redis来做的话 设计结构如下:

地图编辑器的  redis 结构


每张地图信息 string   记录着地图创建者 id 鲜花 鸡蛋  时间戳等信息
key=map-info-XXXX  value={"like:12,hate:12"}
XXX表示唯一id

每天上传地图信息  list   只是地图id列表
key=maps-info-day-2018-1-1  value=list 只记录list id 索引

每天的排行榜信息 sorted-set
key=maps-score-day-2018-1-1 value=sorted-set 只记录分数 和地图id  在这里可动态更新  set 集合的 score 和member(value)--排序,分数由鲜花鸡蛋等 计算出来

虽然能很好的额完成排序和单位玩家索引功能, 但是功能2就不好处理了,首先是要遍历整个相关key,或者在建立一个key-list 用来保存所有玩家的所有地图id。这样一个问题是key太多,和多重key,虽然他们大部分都是索引id但是太复杂。删除一个 其他key都要更新,集群的话还不能mset 。

缺陷:整体查询不好做。

优点:排序方便(性能还待和mysql对比)

---------------------------------------MYSQL 来做的话  主要是SQL查询优化。

涉及到2个大问题:查询and 排序;先建立索引 create index idx on map_info(id);

查询:

先创建 500W 条记录,

打开统计,navicat for mysql   .......set profiling=1;

显示计时统计:show profiles;

1.暴力全部查询 :select* from map_info 耗时3.282s

2.limit 暴力查询分页:SELECT * FROM `map_info` LIMIT 3000000, 20   耗时0.77s

3.limit where id 优化分页查询:SELECT * FROM `map_info`  where id >3000000 limit 20 耗时0.000s

4. 倒叙查看优化limit分页查询:SELECT * FROM `map_info`  where id <2000000000000  ORDER BY id desc limit 10  耗时0.000s

 

 

排序:

排序就用order by 常规方法来排序,因此不是大问题 就算排序10s 也无所谓。

1:按照鸡蛋数排序:SELECT * FROM `map_info`  where id <2000000000000  ORDER BY hate desc limit 50  耗时1.7s

2:1E条数据,完全排序耗时:84.170s

----------------------------------------redis和mysql协作

 

思考:mysql 查询优化后确实很快,但是排序就很慢了,。因此我们要缓存排序结果。实际需求是每天凌晨更新一次排序值,这个恰恰能帮助我们进行复杂的sql语句排序工作。

方案:数据查询插入什么的直接操作mysql, 每天凌晨直接排序,然后把结果缓存到redis。所有当日自定义地图(排序后的数据)请求都访问redis中的缓存数据即可。 对于优化后的查询如果还不能满足性能需求的话,可能还要进一步利用redis来缓存(看实际性能指标来衡量,比如大量的链接,虽然单台是0.00s 毫秒级别 但是机器多了,性能也就下去了)。

排序保护(可以考虑和策划商量需求更改,比如凌晨半小时内禁止玩家上传地图什么的,来让排序工作不至于产生意外的事情)。

 

© 著作权归作者所有

共有 人打赏支持
梦想游戏人
粉丝 37
博文 441
码字总数 125736
作品 0
成都
私信 提问
mysql 单表百万级记录查询分页优化

insert select (制造百万条记录) 在开始百万级数据的查询之前,自己先动手制造百万级的记录来供我们使用,使用的方法是insert select方法 INSERT 一般用来给表插入一个指定列值的行。但是,...

nao
2015/09/22
509
0
寻求关于实现分页查询更好的优化方案

关于收集oschina各位大神对于分页查询的优化方案 之前在网上找了许多的数据分页查询方案从sql 优化 到 实现 缓存技术进行分页,感觉还是不满足。 1.下面提交下满足条件 当前大多数新手小白的...

votouch
2018/04/13
101
0
oracle sql语句优化

统计地区用户数量,地区area(area_id,name),用户表 account(id,name,area_id),求一个高性能的查询语句,百万级的用户数据

轩辕剑
2014/01/02
170
3
SQL优化真是好累,求看下百万级表怎么join?

三个百万级的表left join 最后是用分页的,加了row_number()分页也没效果 执行计划如下: 执行还需要10几秒,真心优化不动了,又不能改数据结构,整个业务表出来就好了,哎 还有什么其他方法...

roywang
2012/11/12
5.2K
13
MySQL 百万级分页优化(Mysql千万级快速分页)

一般刚开始学SQL的时候,会这样写复制代码 代码如下: 但在数据达到百万级的时候,这样写会慢死复制代码 代码如下: 也许耗费几十秒 网上很多优化的方法是这样的复制代码 代码如下: 是的,速度...

yiqifendou
2016/10/11
86
0

没有更多内容

加载失败,请刷新页面

加载更多

我所遇到的GitLab 502问题的解决

我所遇到的GitLab 502问题的解决 2015年02月11日 20:17:07 wangxicoding 阅读数:51095 标签: gitlab 502 解决 端口冲突 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://bl...

rootliu
43分钟前
5
0
OSChina 周五乱弹 —— 对不起,把你看成绿灯了

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @-冰冰棒- :#今日歌曲推荐# 梁博《男孩 (Live)》居然只有现场版,也是好听cry。 《男孩 (Live)》- 梁博 手机党少年们想听歌,请使劲儿戳(这...

小小编辑
53分钟前
438
9
移植Modbus到STM32F103(2):移植FreeModbus到usart3并运行示例代码

FreeModbus是Modbus的一个被广泛移植的实现。其源码在github,最新版是1.6。 FreeModbus支持Modbus功能码里的0x01~0x06,0x0F~0x11和0x17,对一些功能比如异常诊断和读事件计数等功能码并没有...

Konstantine
今天
3
0
浅谈神经网络(神经网络篇)

背景 之前写过浅谈神经网络基础篇,简单介绍下机器学习这块内容,用于扫盲。本文正式将神经网络,这部分是深度学习的基础。了解完可以掌握强大的机器学习的方法,也可以更好的了解深度学习。...

Uknowzheng
今天
5
0
移动硬盘变为RAW格式后的修复

在Mac上使用自己的移动硬盘结果文件系统格式变为RAW; 在自己windows笔记本上使用chkdsk H: /F进行修复,修复日志如下: C:\Users\mengzhang6>chkdsk H: /F文件系统的类型是 NTFS。卷标是 do...

晨猫
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部