当前位置: 首页 > 网络应用技术

为什么我建议桌子上有大量数据

时间:2023-03-06 16:08:59 网络应用技术

  个人创作惯例:我宣布的所有创建文章都是原始的。如果有任何文章,它将被标记。如果有遗漏,欢迎您批评。如果您发现互联网上有pla窃,请报告并积极地将问题提交给这个Github仓库,谢谢您的支持?

  本文是“为什么我建议”系列的第三部分。在本系列中,我将解释,分析本系列中背景发展的一些发展建议和发展规范。在面对高分子业务时,请避免一些坑。

  通常,与某些配置相比,数据库的分数将求解要维护的同时维护的单个限制的限制的数据量以及单一确定的Mysql的限制。SQL分布式数据库解决方案。如果使用MySQL,则可以考虑使用TIDB(实现MySQL协议,与MySQL客户端兼容和SQL语句。)。他们目前有自己的云部署解决方案。你可以试试:

  但是,对于传统数据库表的项目,底部数据库基于传统的关系数据库,例如mySQL和pgsql.generally,在业务开始时,我们将考虑更多按下平板电脑,例如订单表。我们估计用户想要直接检查的订单记录是在过去的一年中。目前,它不是业务数据库,而是一个档案数据库,例如HBASE。)不会超过100,000/s。然后我们可以考虑将其分为64个表(最佳数字为2^n,因为2^n的剩余数量可用于2^n -1,减少了芯片债券的数量)。。

  但是,经过很长时间,会发现一些带有碎片债券的常见查询(以下是用户ID)也有点慢,有些是错误的本地索引。

  例如,此SQL:

  该表的表键是user_id

  对于随机索引样本,MySQL越来越不准确。因为统计信息不是实时更新,但是更新的数量超过了一定百分比以开始更新。统计数据不是完整的统计信息,而是采样统计。因此,当表格数据量很大时,此统计信息是很难非常准确。要自动刷新数据机制的数据机制,这些参数很难调整(主要是此参数,我们通常不会更改,我们将无法在存储器中接受它。如果数据库重新启动,必须对表进行重新分析,以便减慢启动启动。时间,我们不会关闭,这将导致优化器分析变得越来越不准确),很难预测什么值最合适。业务增长,用户行为引起的数据的倾斜也很难预测。当通过Alter表修改表时,它将带来与分析表相同的效果。它将在表上添加锁以阻止表上的更新和交易。因此,它不能在此在线业务的钥匙表上使用。因此,最好从一开始就估算大手表的大小,但是这是困难的。

  因此,我们认为对于具有相对较大数据的表,最好先通过拆分表来控制每个表的数据量,但是业务增长和产品需求一直在迭代且复杂。不会有大型索引表。在这种情况下,我们需要我们。在适当增加的前提下,某些用户触发的密钥查询SQL使用Force索引指导其采用正确的索引。

  但是,有时即使索引正确,查询仍然有点慢。当您查看此SQL扫描扫描的数据数时,您会发现没有很多。

  SQL可能仍然如此缓慢,并且随着时间的流逝,这与MySQL InnoDB中的删除机制有关,在目前,大多数InnoDB引擎都用于大多数业务表中,并且使用了默认行格式的动态。。以这种行格式,当我们插入数据时,结构可能如下所示:

  在记录标题中,有一个删除标记:

  当更新录制长度(例如长字段的实际数据)时,它将标记原始记录为删除,然后在末尾创建更新的记录。删除记录时,它只是删除标记唱片头。

  对于这种可能的碎片化,MySQL InnoDB还具有期望和措施,也就是说,InnoDB引擎只能存储占空间93%的数据。

  在正常情况下,这种性能损失不会导致过多的性能,因为删除通常被删除旧数据,并且更新通常集中在最近的数据中。例如,更新订单。通常,最新订单将被更新。很少有很久以前,这些订单不会更新,并且删除和删除的订单通常是很久以前的。更复杂。例如,不同类型的订单具有不同的及时性。一年前可能有一个不成功的预订订单,无法存档。从时间上看,您的数据可能会像这样:

  结果,您需要扫描几页的数据。随着时间的流逝,越来越多的片段和越来越多的页面进行扫描,因此SQL执行将变得越来越慢。

  以上是对表本身数据存储的影响。对于第二级索引,由于存在MVCC机制,频繁更新索引字段还将导致索引的大量空腔。Reference文档:https://dev.mysql.com/doc/doc/refman/8.0/innodb-multi-versioning.html

  辅助索引记录不包含隐藏的系统列,也不包含其就地更新。

  我们知道MySQL InnoDB已在聚类索引索引的原始位置上更新。对于第二级索引,如果更新了第二级索引列,则在原始记录中制作删除标记,然后在新的地方记录。这将像以前一样引起许多存储片段。

  总之:

  对于这种情况,我们可以通过重建表来解决它。重建表实际上是两条行为:首先,您可以优化此存储片段并减少要扫描的行数;其次,您可以重新分析以使SQL优化器收集数据更准确。

  在MySQL 5.6.17之前,我们需要使用外部工具pt-online-schema-change来帮助我们完成表格的重建。与新表相关更新,同时,请将数据复制到新表格 -构建表。完成后,获取全局锁以修改新表名称为原始表名称,然后删除原始表格。在MySQL 5.6.17后,Optimize Table命令将变为在线DDL。仅在准备阶段和最后提交阶段。您需要获得锁。中间执行阶段不需要锁定,即不会阻止业务的更新DML。参考官方网站文档:https://dev.mysql.com/doc/refman/5.6/optimize-table.htable.html

  

  阶段和操作的提交阶段。在准备阶段,更新元数据并考虑了中间的介于中介。在命令期间,表格元数据是舒适感。

  对于需要注意使用InnoDB表的优化表命令的某些点:

  1.实际上,优化大多数InnoDB表的表等效于重建表+分析命令(等效于语句),但与分析命令不同,使用最终提交阶段优化锁定锁定,大大缩短了业务DML Blockage Blockage Time,该锁定时间是是,这是一个可以在线考虑的优化语句(MySQL 5.6.17是这种情况)

  2.但是,当业务较低时,您仍然需要选择优化表,因为就像执行其他在线DDL一样,它将创建和记录临时日志文件。该文件记录所有DML插入,更新,删除在操作期间DDL操作期间的删除。DATA,如果在业务的高峰处执行,则可能会导致大量日志,超过限制:

  3.在这种情况下,如果我们已经处于低峰值业务期,但是我们仍然报告此错误,我们可以稍微调整大小,但是我们不能调整太多。建议每次调整128 MB(默认为128 MB)。如果这太大,可能存在两个问题:(1)最终提交阶段,由于大量日志和提交时间太长,导致太长。(2)由于由于业务压力而持续撰写了此临时文件,因此尚未被抓住,这在业务峰会到来时会导致该声明。4。建议在执行时,如果要评估该在线业务的影响,则可以监视锁和这两个锁。如果这两个相关锁定的锁定事件太多了,并且在行上有明显的慢速SQL。建立或在其他时间留下优化表语句。

  微信搜索“干货充满了张哈希”,以遵循公共帐户,再加上作者微信,每天一次刷子,轻松改进技术,并获得各种优惠