当前位置: 首页 > news >正文

怎么往公司网站添加网络公司除了建网站

怎么往公司网站添加,网络公司除了建网站,厦门app制作,设计图库千万级大表如何优化#xff0c;这是一个很有技术含量的问题#xff0c;通常我们的直觉思维都会跳转到拆分或者数据分区#xff0c;在此我想做一些补充和梳理#xff0c;想和大家做一些这方面的经验总结#xff0c;也欢迎大家提出建议。从一开始脑海里开始也是火光四现这是一个很有技术含量的问题通常我们的直觉思维都会跳转到拆分或者数据分区在此我想做一些补充和梳理想和大家做一些这方面的经验总结也欢迎大家提出建议。从一开始脑海里开始也是火光四现到不断的自我批评后来也参考了一些团队的经验我整理了下面的大纲内容。既然要吃透这个问题我们势必要回到本源我把这个问题分为三部分:“千万级”“大表”“优化”也分别对应我们在图中标识的“数据量”“对象”和“目标”。我来逐步展开说明一下从而给出一系列的解决方案。1.数据量千万级千万级其实只是一个感官的数字就是我们印象中的数据量大。 这里我们需要把这个概念细化因为随着业务和时间的变化数据量也会有变化我们应该是带着一种动态思维来审视这个指标从而对于不同的场景我们应该有不同的处理策略。1) 数据量为千万级可能达到亿级或者更高通常是一些数据流水日志记录的业务里面的数据随着时间的增长会逐步增多超过千万门槛是很容易的一件事情。2) 数据量为千万级是一个相对稳定的数据量如果数据量相对稳定通常是在一些偏向于状态的数据比如有1000万用户那么这些用户的信息在表中都有相应的一行数据记录随着业务的增长这个量级相对是比较稳定的。3) 数据量为千万级不应该有这么多的数据这种情况是我们被动发现的居多通常发现的时候已经晚了比如你看到一个配置表数据量上千万;或者说一些表里的数据已经存储了很久99%的数据都属于过期数据或者垃圾数据。数据量是一个整体的认识我们需要对数据做更近一层的理解这就可以引出第二个部分的内容。2.对象数据表数据操作的过程就好比数据库中存在着多条管道这些管道中都流淌着要处理的数据这些数据的用处和归属是不一样的。一般根据业务类型把数据分为三种1流水型数据流水型数据是无状态的多笔业务之间没有关联每次业务过来的时候都会产生新的单据比如交易流水、支付流水只要能插入新单据就能完成业务特点是后面的数据不依赖前面的数据所有的数据按时间流水进入数据库。2状态型数据状态型数据是有状态的多笔业务之间依赖于有状态的数据而且要保证该数据的准确性比如充值时必须要拿到原来的余额才能支付成功。3配置型数据此类型数据数据量较小而且结构简单一般为静态数据变化频率很低。至此我们可以对整体的背景有一个认识了如果要做优化其实要面对的是这样的3*3的矩阵如果要考虑表的读写比例读多写少读少写多...那么就会是3*3*424种显然做穷举是不显示的而且也完全没有必要可以针对不同的数据存储特性和业务特点来指定不同的业务策略。对此我们采取抓住重点的方式把常见的一些优化思路梳理出来尤其是里面的核心思想也是我们整个优化设计的一把尺子而难度决定了我们做这件事情的动力和风险。而对于优化方案我想采用面向业务的维度来进行阐述。3.目标优化在这个阶段我们要说优化的方案了总结的有点多相对来说是比较全了。整体分为五个部分其实我们通常所说的分库分表等方案只是其中的一小部分如果展开之后就比较丰富了。其实不难理解我们要支撑的表数据量是千万级别相对来说是比较大了DBA要维护的表肯定不止一张如何能够更好的管理同时在业务发展中能够支撑扩展同时保证性能这是摆在我们面前的几座大山。我们分别来说一下这五类改进方案优化设计方案1.规范设计在此我们先提到的是规范设计而不是其他高大上的设计方案。黑格尔说秩序是自由的第一条件。在分工协作的工作场景中尤其重要否则团队之间互相牵制太多问题多多。规范设计我想提到如下的几个规范其实只是属于开发规范的一部分内容可以作为参考。规范的本质不是解决问题而是有效杜绝一些潜在问题对于千万级大表要遵守的规范我梳理了如下的一些细则基本可以涵盖我们常见的一些设计和使用问题比如表的字段设计不管三七二十一都是varchar(500),其实是很不规范的一种实现方式我们来展开说一下这几个规范。1配置规范1MySQL数据库默认使用InnoDB存储引擎。2保证字符集设置统一MySQL数据库相关系统、数据库、表的字符集使都用UTF8应用程序连接、展示等可以设置字符集的地方也都统一设置为UTF8字符集。注UTF8格式是存储不了表情类数据需要使用UTF8MB4可在MySQL字符集里面设置。在8.0中已经默认为UTF8MB4可以根据公司的业务情况进行统一或者定制化设置。3MySQL数据库的事务隔离级别默认为RRRepeatable-Read建议初始化时统一设置为RCRead-Committed对于OLTP业务更适合。4数据库中的表要合理规划控制单表数据量对于MySQL数据库来说建议单表记录数控制在2000W以内。5MySQL实例下数据库、表数量尽可能少数据库一般不超过50个每个数据库下数据表数量一般不超过500个包括分区表。2建表规范1InnoDB禁止使用外键约束可以通过程序层面保证。2存储精确浮点数必须使用DECIMAL替代FLOAT和DOUBLE。3整型定义中无需定义显示宽度比如使用INT而不是INT(4)。4不建议使用ENUM类型可使用TINYINT来代替。5尽可能不使用TEXT、BLOB类型如果必须使用建议将过大字段或是不常用的描述型较大字段拆分到其他表中另外禁止用数据库存储图片或文件。6存储年时使用YEAR(4)不使用YEAR(2)。7建议字段定义为NOT NULL。8建议DBA提供SQL审核工具建表规范性需要通过审核工具审核后3命名规范1库、表、字段全部采用小写。2库名、表名、字段名、索引名称均使用小写字母并以“_”分割。3库名、表名、字段名建议不超过12个字符。库名、表名、字段名支持最多64个字符但为了统一规范、易于辨识以及减少传输量统一不超过12字符4库名、表名、字段名见名知意不需要添加注释。对于对象命名规范的一个简要总结如下表4-1所示供参考。4索引规范1索引建议命名规则idx_col1_col2[_colN]、uniq_col1_col2[_colN]如果字段过长建议采用缩写。2索引中的字段数建议不超过5个。3单张表的索引个数控制在5个以内。4InnoDB表一般都建议有主键列尤其在高可用集群方案中是作为必须项的。5建立复合索引时优先将选择性高的字段放在前面。6UPDATE、DELETE语句需要根据WHERE条件添加索引。7不建议使用%前缀模糊查询例如LIKE “%weibo”无法用到索引会导致全表扫描。8合理利用覆盖索引例如9SELECT email,uid FROM user_email WHERE uidxx如果uid不是主键可以创建覆盖索引idx_uid_email(uid,email)来提高查询效率。10避免在索引字段上使用函数否则会导致查询时索引失效。11确认索引是否需要变更时要联系DBA。5应用规范1避免使用存储过程、触发器、自定义函数等容易将业务逻辑和DB耦合在一起后期做分布式方案时会成为瓶颈。2考虑使用UNION ALL减少使用UNION因为UNION ALL不去重而少了排序操作速度相对比UNION要快如果没有去重的需求优先使用UNION ALL。3考虑使用limit N少用limit MN特别是大表或M比较大的时候。4减少或避免排序如group by语句中如果不需要排序可以增加order by null。5统计表中记录数时使用COUNT(*)而不是COUNT(primary_key)和COUNT(1)InnoDB表避免使用COUNT(*)操作计数统计实时要求较强可以使用Memcache或者Redis非实时统计可以使用单独统计表定时更新。6做字段变更操作modify column/change column的时候必须加上原有的注释属性否则修改后注释会丢失。7使用prepared statement可以提高性能并且避免SQL注入。8SQL语句中IN包含的值不应过多。9UPDATE、DELETE语句一定要有明确的WHERE条件。10WHERE条件中的字段值需要符合该字段的数据类型避免MySQL进行隐式类型转化。11SELECT、INSERT语句必须显式的指明字段名称禁止使用SELECT * 或是INSERT INTO table_name values()。12INSERT语句使用batch提交INSERT INTO table_name VALUES(),(),()……values的个数不应过多。优化设计方案2业务层优化业务层优化应该是收益最高的优化方式了而且对于业务层完全可见主要有业务拆分数据拆分和两类常见的优化场景读多写少读少写多1业务拆分ü 将混合业务拆分为独立业务ü 将状态和历史数据分离业务拆分其实是把一个混合的业务剥离成为更加清晰的独立业务这样业务1业务2。。。独立的业务使得业务总量依旧很大但是每个部分都是相对独立的可靠性依然有保证。对于状态和历史数据分离我可以举一个例子来说明。例如我们有一张表Account假设用户余额为100。我们需要在发生数据变更后能够追溯数据变更的历史信息如果对账户更新状态数据增加100的余额这样余额为200。这个过程可能对应一条update语句一条insert语句。对此我们可以改造为两个不同的数据源account和account_hist在account_hist中就会是两条insert记录如下:而在account中则是一条update语句如下这也是一种很基础的冷热分离可以大大减少维护的复杂度提高业务响应效率。2数据拆分2.1 按照日期拆分这种使用方式比较普遍尤其是按照日期维度的拆分其实在程序层面的改动很小但是扩展性方面的收益很大。数据按照日期维度拆分如test_20191021数据按照周月为维度拆分,如test_201910数据按照季度年维度拆分,如test_20192.2 采用分区模式分区模式也是常见的使用方式采用hash,range等方式会多一些在MySQL中我是不大建议使用分区表的使用方式因为随着存储容量的增长数据虽然做了垂直拆分但是归根结底数据其实难以实现水平扩展在MySQL中是有更好的扩展方式。2.3 读多写少优化场景采用缓存采用Redis技术将读请求打在缓存层面这样可以大大降低MySQL层面的热点数据查询压力。2.4 读少写多优化场景可以采用三步走1) 采用异步提交模式异步对于应用层来说最直观的就是性能的提升产生最少的同步等待。2) 使用队列技术大量的写请求可以通过队列的方式来进行扩展实现批量的数据写入。3) 降低写入频率这个比较难理解我举个例子对于业务数据比如积分类相比于金额来说业务优先级略低的场景如果数据的更新过于频繁可以适度调整数据更新的范围比如从原来的每分钟调整为10分钟来减少更新的频率。例如更新状态数据积分为200如下图所示可以改造为如下图所示。如果业务数据在短时间内更新过于频繁比如1分钟更新100次积分从100到10000则可以根据时间频率批量提交。例如更新状态数据积分为100如下图所示。无需生成100个事务200条SQL语句可以改造为2条SQL语句如下图所示。对于业务指标比如更新频率细节信息可以根据具体业务场景来讨论决定。优化设计方案3架构层优化架构层优化其实就是我们认为的那种技术含量很高的工作我们需要根据业务场景在架构层面引入一些新的花样来。3.1.系统水平扩展场景3.1.1采用中间件技术可以实现数据路由水平扩展常见的中间件有MyCATShardingSphere,ProxySQL等3.1.2 采用读写分离技术这是针对读需求的扩展更侧重于状态表在允许一定延迟的情况下可以采用多副本的模式实现读需求的水平扩展也可以采用中间件来实现如MyCAT,ProxySQL,MaxScale,MySQL Router等3.1.3 采用负载均衡技术常见的有LVS技术或者基于域名服务的Consul技术等3.2.兼顾OLTPOLAP的业务场景可以采用NewSQL优先兼容MySQL协议的HTAP技术栈如TiDB3.3.离线统计的业务场景有几类方案可供选择。3.3.1 采用NoSQL体系主要有两类一类是适合兼容MySQL协议的数据仓库体系常见的有Infobright或者ColumnStore另外一类是基于列式存储属于异构方向如HBase技术3.3.2 采用数仓体系基于MPP架构,如使用Greenplum统计如T1统计优化设计方案4数据库优化数据库优化其实可打的牌也不少但是相对来说空间没有那么大了我们来逐个说一下。4.1 事务优化根据业务场景选择事务模型是否是强事务依赖对于事务降维策略我们来举出几个小例子来。4.1.1 降维策略1存储过程调用转换为透明的SQL调用对于新业务而言使用存储过程显然不是一个好主意MySQL的存储过程和其他商业数据库相比功能和性能都有待验证而且在目前轻量化的业务处理中存储过程的处理方式太“重”了。有些应用架构看起来是按照分布式部署的但在数据库层的调用方式是基于存储过程因为存储过程封装了大量的逻辑难以调试而且移植性不高这样业务逻辑和性能压力都在数据库层面了使得数据库层很容易成为瓶颈而且难以实现真正的分布式。所以有一个明确的改进方向就是对于存储过程的改造把它改造为SQL调用的方式可以极大地提高业务的处理效率在数据库的接口调用上足够简单而且清晰可控。4.1.2 降维策略2DDL操作转换为DML操作有些业务经常会有一种紧急需求总是需要给一个表添加字段搞得DBA和业务同学都挺累可以想象一个表有上百个字段而且基本都是name1name2……name100这种设计本身就是有问题的更不用考虑性能了。究其原因是因为业务的需求动态变化比如一个游戏装备有20个属性可能过了一个月之后就增加到了40个属性这样一来所有的装备都有40个属性不管用没用到而且这种方式也存在诸多的冗余。我们在设计规范里面也提到了一些设计的基本要素在这些基础上需要补充的是保持有限的字段如果要实现这些功能的扩展其实完全可以通过配置化的方式来实现比如把一些动态添加的字段转换为一些配置信息。配置信息可以通过DML的方式进行修改和补充对于数据入口也可以更加动态、易扩展。4.1.3 降维策略3Delete操作转换为高效操作有些业务需要定期来清理一些周期性数据比如表里的数据只保留一个月那么超出时间范围的数据就要清理掉了而如果表的量级比较大的情况下这种Delete操作的代价实在太高我们可以有两类解决方案来把Delete操作转换为更为高效的方式。第一种是根据业务建立周期表比如按照月表、周表、日表等维度来设计这样数据的清理就是一个相对可控而且高效的方式了。第二种方案是使用MySQL rename的操作方式比如一张2千万的大表要清理99%的数据那么需要保留的1%的数据我们可以很快根据条件过滤补录实现“移形换位”。4.2 SQL优化其实相对来说需要的极简的设计很多点都在规范设计里面了如果遵守规范八九不离十的问题都会杜绝掉在此补充几点4.2.1 SQL语句简化简化是SQL优化的一大利器因为简单所以优越。4.2.2 尽可能避免或者杜绝多表复杂关联大表关联是大表处理的噩梦一旦打开了这个口子越来越多的需求需要关联性能优化就没有回头路了更何况大表关联是MySQL的弱项尽管Hash Join才推出不要像掌握了绝对大杀器一样在商业数据库中早就存在问题照样层出不穷。4.2.3 SQL中尽可能避免反连接避免半连接这是优化器做得薄弱的一方面什么是反连接半连接其实比较好理解举个例子not in ,not exists就是反连接in,exists就是半连接在千万级大表中出现这种问题性能是几个数量级的差异。4.3 索引优化应该是大表优化中需要把握的一个度。4.3.1 首先必须有主键规范设计中第一条就是此处不接收反驳。4.3.2 其次SQL查询基于索引或者唯一性索引使得查询模型尽可能简单。4.3.3 最后尽可能杜绝范围数据的查询范围扫描在千万级大表情况下还是尽可能减少。​优化设计方案4管理优化这部分应该是在所有的解决方案中最容易被忽视的部分了我放在最后在此也向运维同事致敬总是为很多认为本应该正常的问题尽职尽责背锅。千万级大表的数据清理一般来说是比较耗时的在此建议在设计中需要完善冷热数据分离的策略可能听起来比较拗口我来举一个例子把大表的Drop 操作转换为可逆的DDL操作。Drop操作是默认提交的而且是不可逆的在数据库操作中都是跑路的代名词MySQL层面目前没有相应的Drop操作恢复功能除非通过备份来恢复但是我们可以考虑将Drop操作转换为一种可逆的DDL操作。MySQL中默认每个表有一个对应的ibd文件其实可以把Drop操作转换为一个rename操作即把文件从testdb迁移到testdb_arch下面从权限上来说testdb_arch是业务不可见的rename操作可以平滑的实现这个删除功能如果在一定时间后确认可以清理则数据清理对于已有的业务流程是不可见的如下图所示。此外还有两个额外建议一个是对于大表变更尽可能考虑低峰时段的在线变更比如使用pt-osc工具或者是维护时段的变更就不再赘述了。最后总结一下其实就是一句话千万级大表的优化是根据业务场景以成本为代价进行优化的绝对不是孤立的一个层面的优化。个人新书 《MySQL DBA工作笔记》个人公众号jianrong-notes
http://www.pierceye.com/news/47529/

相关文章:

  • 快速搭建网站vuewordpress用户注册文件
  • 如何建设营销型的网站河南建设集团网站
  • 1个月能学好网站开发吗建立网站可以赚钱吗
  • 关键词优化流程肥城市区seo关键词排名
  • 网站是否需要备案百度收录最新方法
  • 贵阳做网站开发的公司网站关键字排名
  • 付费网站搭建官方正版浏览器
  • 建立 网站服务器wordpress主题学习教程
  • 怎么做网站icp备案wordpress站所有分类不显示
  • 哪个网站可以做付费推广专业开发小程序公司
  • 网站赢利网页游戏传奇霸业攻略
  • 网站建设搜索南充做网站公司
  • 公司新建了网站以前的就网站可以全部删除吗桂林创新大厦网站
  • 阿里云的wordpress建站濮阳住房建设厅网站
  • 郑州网站建设费用.net 购物网站开发源代码
  • 做好的网站启用商城开源代码
  • 外卖网站建设文档聚财三个字公司名字
  • 公司网站制作与推广如何向google提交网站
  • 制做商品网站开发小程序的软件有哪些
  • html做的网站排版错误家庭装修设计平台
  • 网站首页改版需求wordpress模板信息
  • 域名进行网站备案怎样申请网站域名和空间
  • 网站建设捌金手指花总四wordpress编辑可以设置用户权限
  • 昆明网站建设logovi编写微信小程序用什么软件
  • 网站推广的工作内容重庆在线最新招聘信息
  • 微信网站开发报价海口模板建站哪家好
  • 网站维护的方法抓取网站访客qq代码
  • 网站建设的现状首页通知书
  • 普通网站一年要多少钱顺德水利和国土建设局网站
  • 重庆巴南区网站开发网站页脚设计的几个小技巧