热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

从12306的奔溃,说说我们怎么去做性能优化?

开篇语最近12306又崩溃了一次,但其实12306这样的体量跟我们平常接触的架构基本没什么太大的关系。话又说回来,12306也是由一个个小功能组成的。做好自己的小蚂蚁,就能让大部队

开篇语

最近12306又崩溃了一次,但其实12306这样的体量跟我们平常接触的架构基本没什么太大的关系。

话又说回来,12306也是由一个个小功能组成的。

做好自己的小蚂蚁,就能让大部队变得更快。

因为跟数据库、数据仓库、查询打交道比较多,所以我就简单说一下数据查询的优化过程吧。

不客气地说,在性能优化中,其实80%的问题都是源于数据查询。

以下步骤是以优化代价、数据量级为衡量,从低到高开始,步步进推。

GO

(1)如果数据查询缓慢,80%的原因都是因为SQL。先找出慢SQL,以Oracle为例,可以通过AWR报表的方式查看。

(2)查看慢SQL的执行计划,看看查询的关键字段是不是缺失索引,添加索引。

(3)有索引,但是查看执行计划,并没有走索引。此时有两种方法,一是用hint,二是可能数据表最近被大批量的删除、新增过,需要手动收集数据表的统计信息,让SQL优化器正常解析SQL。

(4)数据表太大,没有合适的全局索引。可不可以建设分区表?按照时间、地区进行分区操作。

(5)不能分区,或者分区效果也不显著,需要考虑改动表结构了,有些字段是不是可以拆出去?做成维表、扩展表?

【这是垂直拆分。缺点是查询时如果要查询扩展表字段,需要join操作,插入修改时要考虑多表,事物复杂。单表数据量还是太大。】

(6)或者可以考虑进行分库分表操作。对于Oracle来说单张1亿以下数据分区就够了,不需要分库分表。

【水平拆分。缺点是会导致事物一致性更为复杂,还需引入分库分表的管理中间件。】

(7)进行历史数据分离。将一些不常用的数据,例如两年前的数据都拆分到历史表中。

【即冷热数据分离。】

(8)读写分离,再新建个数据查询库,oracle用OGG、mysql用binlog做数据同步,将查询模块更换数据源。

(9)增加数据库的服务器性能,升级硬件,例如磁盘换上SSD。这个方法是被验证过了的,尤其是查询批量数据、无高效索引的时候。

(10)从数据库层面已经无法优化了,我们可以考虑在应用端使用并行查询的方法爬出数据,然后再行合并。

【事实上,很多报表工具都是这么做的。】

(11)并行查询再高端点,用流行的话来说,叫分布式计算。

【12306就是用Pivotal的 GemFire,将单次查询的最长时间从15秒下降到0.2秒以下。】

(12)这个数据库性能就是达到瓶颈了,我们来更换数据库吧,换成性能更好的数据库,要做数据迁移,重新测试验证,代价不菲。

(13)从业务上去优化,看看这样查询是不是有道理,这些字段是不是确实需要?需不需要这么精细?需不需要这么频繁?

大数据量报表每月一出就行了?那这样就无所谓时效性了。嗯,那我们来做数据仓库吧。

(14)我们用了Hadoop + RDBMS做了数据仓库。

数据仓库不能实时查询怎么办?我们来做实时仓库吧。

(15)我们用了kafka + spark + jstorm做了实时仓库,结果你跟我说过时了?刚刚升级成了Spark Streaming ?嗯?又换成Flink了?

好吧,爱咋咋地。

结语

说到这里没啥可说的了,或者以后想起来什么还可以再说说吧。

性能优化其实是一个持续迭代的过程,并非一蹴而就,也不是一步到位的工作。

有时候有很多方案,关键是看怎样代价最小。(改造成本、硬件成本、紧急状况)

每个人,还是先从写好一个SQL,一段代码开始吧。

撒花,结束。

END.


推荐阅读
  • 什么是大数据lambda架构
    一、什么是Lambda架构Lambda架构由Storm的作者[NathanMarz]提出,根据维基百科的定义,Lambda架构的设计是为了在处理大规模数 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • ElasticSerach初探第一篇认识ES+环境搭建+简单MySQL数据同步+SpringBoot整合ES
    一、认识ElasticSearch是一个基于Lucene的开源搜索引擎,通过简单的RESTfulAPI来隐藏Lucene的复杂性。全文搜索,分析系统&# ... [详细]
  • 14亿人的大项目,腾讯云数据库拿下!
    全国人 ... [详细]
  • 如何在mysqlshell命令中执行sql命令行本文介绍MySQL8.0shell子模块Util的两个导入特性importTableimport_table(JS和python版本 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • {moduleinfo:{card_count:[{count_phone:1,count:1}],search_count:[{count_phone:4 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有