首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MySQL中10多张关联要做优化,怎么理解逻辑幂等

最近优化了一条MySQL的慢查询SQL,还是蛮有感触,小结一下。...首先问题的背景是一个业务做压力测试,排除了很多的前期问题,使用的最有效手段就是索引,在最后一个环节,问题开始陷入焦灼状态,因为这一条SQL的相关有16张,而且是在业务环节中频繁调用和引用的逻辑。...一般碰到问题都会有一个疑问,说这是谁写的SQL,应该快速重构,但是大部分优化场景都是:优化可以做,但业务不能停。 所以重构需要,但是不是现在。...那就是里面有一个明显全扫描的逻辑,也就意味着尽管这么多表关联,但是数据量也可以接受,在优化器解析时大部分逻辑是走了索引,优化好最后一个扫描,整个问题就迎刃而解了。...所以对于上面的逻辑,其实数据product和tag要联合输出数据,需要借助一个中间tag_product,那么tag_product应该是连接数据的纽带,一个相对比较合理的方式就是其实基于product

3.4K10
您找到你想要的搜索结果了吗?
是的
没有找到

MySql基础-笔记11-临时、复制表、元数据、序列使用

临时只在当前连接可见,如果使用脚本来创建MySQL临时,那每当脚本执行完成后,该临时也会自动销毁。...如果使用了其他MySQL客户端程序连接MySQL数据库服务器来创建临时,那么只有在关闭客户端程序时才会销毁临时,也可以手动销毁。...1.2、实例 图片1.3、删除临时图片2、复制表即 完整的复制MySQL数据。...旧表 图片3、元数据3.1、获取服务器元数据图片图片图片图片4、序列使用4.1、说明MySQL 序列是一组整数:1, 2, 3, ......,由于一张数据只能有一个字段自增主键, 如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现。

81550

一个线上MySQL查询引发的报警

// 一个线上MySQL查询引发的报警 // 今天遇见了一个线上的MySQL问题,问题的内容是某个阿里云ECS频繁报警,报警的内容是:CPU使用率超过阈值。...也就是说,这个只有一个主键id。的数据量有500w,咨询了一下业务方,他们会每3分钟,在这个上运行一遍上面的SQL查询数据。...好了,现在问题描述基本上清楚了: 1、CPU报警 2、慢查询导致的报警 3、数据量500w,只有一个id主键,没有其他索引 4、where条件中flag字段有is null的判断逻辑,还有sever字段的判断逻辑...这里,为了测试null值直接改为default 0之后,原来的记录,会不会被修改,我首先做了一个小的测试: mysql 17:07:56>>create table test_flag (id int,...(注意,线上的,尽量使用pt工具进行结构变更:《MySQL删除工具pt-osc》) 修复完null值之后,现在flag中只有0和1两个可能了。问题似乎变的简单了起来。

88030

一个MySQL需求的讨论和引导

昨天收到一个业务同学的需求邮件,一般有些复杂的需求业务同学会发邮件告知我们,需要我们评估之后再做交付,我看了邮件之后,发现这个需求好像有点别扭,大体的意思是在中间件的环境中创建一张结构如下: CREATE...首先对于这个的定义上,业务同学说是归属于状态,也就意味着中的每一个用户都有唯一的状态值对应,这个中存储的数据量会越来越大。...另外根据state=0去查询数据,这个查询的复杂度较高,也就意味着state=0需要遍历所有的分片,每个分片中会通过state=0的索引条件过滤数据最后汇总起来,从使用上来说,这也是分库分一个潜在影响...到了这里需求的方向其实就有了大的转折,这个按照目前的需求其实使用日志的模式要更好一些,比如表中的数据是按照如下的列表情况存储,以日期为维度进行存储。 ?...以上仅是一个需求的讨论过程,不代表方案是最优的,仅供参考。

2.7K20

MYSQL 中间件分一个好主意?

中间件分是不是一个好的主意?...通过中间件来对MYSQL的数据进行分一个常见的对于大数量的解决的方案,通过中间件将应用的数据在中间层进行路由,通过路由将一张的数据,映射到不同物理数据库上的,通过应用设计的分片键将数据根据规则存储在不同的物理服务器上...至于说这是不是一个好的注意,下面想根据不同的层面来看看,分的方式本身是不是一个好的方式。...分的起因主要由三点组成 (基于MYSQL数据库) 1 数据量大,单体数据库无法承载单的数据量 2 数据量大,数据访问出现在优化后,数据访问缓慢的问题,数据写入性能的问题等等 3 单体数据库在大数据量后的运维难度提高...在分后,我们解决了单体MYSQL无法解决的一些问题,那么这是一个好主意吗? 这里且不武断的评判这是不是一个好的注意,我们看看在我们分库分后,我们会遇到什么其他的问题。

30130

MySQL导入导出数据容量的一个问题场景

朋友提了一个MySQL数据导出导入的问题。...问题描述:从源库(兼容MySQL协议的TDSQL,select version()=5.7,test表字符集是utf8,test是个分区)通过如下指令,导出一份数据,SQL格式的,文件6G, mysqldump...将数据导入目标库(docker下的MySQL 8.0,test表字符集是Utf8mb), mysql -hx.x.x.x -P3306 -uroot -proot test < test.sql 源库test...但实际优化源库的,发现的大小,还是和之前相同, (1)optimizer table test;(Innodb的会提示Table does not support optimize, doing...但是,官方文档提到,针对分区,"show table status"的很多字段值,都只是个预估的,不是一个准确值,更精确的方式,是通过查询information_schema的partitions表相关字段

19220

MySQL一个最多可以有多少个字段

Row size too large (> 8126) 到底要闹哪样 这么多错误,还都不一样,MySQL到底要闹那样 别急,一个问题一个问题的看。...有了65535的限制以后还有一个8126的限制是为什么呢? MySQL是分两层的,MySQL Server层 + 存储引擎层。...第2个问题其实是MySQL除了在Server层做了一次限制还会在Innodb存储引擎层在做一次限制。 innodb为了保证B+TREE是一个平衡树结构,强制要求一条记录的大小不能超过一个页大小的一半。...我们这里就有个案例:按照附1的建表语句建立一个150个字段,每个字段是100个字符(特地使用了ASCII字符集,这样一个字符就是一个字节)的。...● 创建一个150个字段长度类型为varchar(100)的可以创建成功。

13.3K91

Mysql闭包之关于国家区域的一个实践

那么如何正确合理地存储这些数据,并且又能很好的适应各种查询场景就成了我们需要考虑的问题,这次我们来考虑通过闭包方案,来达到我们的存储及查询需求。...一、设计闭包 闭包由Closure Table翻译而来,通过父节点、子节点、两节点距离来描述一棵树空间换时间的思想,Closure Table,一种更为彻底的全路径结构,分别记录路径上相关结点的全展开形式...但是它的存储开销会大一些,除了表示结点的Meta信息,还需要一张专用的关系。...; 模拟一些示范数据,如下所示 mysql> select * from area_base; +----+-----------+----------+------------+-----------...curNodeName); areaTree.setChildren(childList); return areaTree; } } 写一个测试用例进行测试

58710

干货 | 一个MySQL 5.7 分区性能下降的案例分析

前言:希望通过本文,使MySQL5.7.18的使用者知晓分区使用中存在的陷阱,避免在该版本上继续踩坑。...同时通过对源码的分享,升级MySQL5.7.18时分区性能下降的根本原因,向MySQL源码爱好者展示分区实现中锁的运用。 问题描述 MySQL 5.7版本中,性能相关的改进非常多。...数据库版本为5.7.18,把调整为非分区,性能正常。 把数据库的版本回退到5.6.21版本,保留分区,性能也是正常 通过上述测试,我们大致判定,这个性能下降和MySQL5.7版本升级有关。...为了进一步分析并定位问题,我们抽丝剥茧,构建了如下一个简单的重现过程 // 创建一个测试分区t2: CREATE TABLE `t2`( `id` INT(11) NOT NULL, `dt...结论 通过上述分析,我们非常确认,这个应该是MySQL 5.7版本的一个regression。我们提交了一个Bug到开源社区。Oracle确认是一个问题,需进一步分析调查这个Bug。

1.9K70

Python采用并发查询mysql以及调用API灌数据 (六)- 解决datetime序列化json格式问题

前情回顾 上一篇文章已经编写了mysql查询以及生成请求api的body数据,那么本章节我们来继续编写解决body序列化json过程中的datetime转化问题。...实战任务 本次因为服务架构重构,优化、重构,带来的任务就是需要从原来的mysql数据库中,读取原数据(部分存在多张关联查询)然后通过调用API的服务方式灌入新的数据库中(包含mysql、mongodb...执行流程如下 那么根据流程所需要的功能,需要以下的实例进行支撑: 1.并发实例 2.查询数据实例 3.执行post请求实例 目标:解决datetime序列化json问题 问题现象 TypeError...H:%M:%S") else: new_body[value] = body[key] return new_body 调用执行一个...下一个篇章,来看看循环执行以及如何并发处理请求。

80240

MYSQL 8 一个实例打开的被那些参数和资源限制 分析

首先安装sysbench 并通过下面的命令来对mysql test 数据库产生 10000万张。...=admin --mysql-password=Huayang3 --mysql-db=test --tables=10000--table_size=1 prepare 在产生这些后,就需要通过...到这里暂时先总结一下,一个INSTANCE 可以打开的数量与什么有关 1 与应用程序的并发度有关,与并发度有关的有 1 table_open_cache 这里table_open_cache...与并发当中打开多少的数量有关,实际上每个在访问中,不会频繁的被打开,句柄是放到table_open_cache 当中....需要注意的是,如果一个语句中包含多个的访问,则一个语句就需要更多的tbale_open_cache. 2 系统的内存,在mysql中打开每个连接都是需要内存的支持的,在刨除 innodb_buffer_pool

64710

MySQL一个200G的大 该如何优化SQL查询操作

最近面试被问到这样一个问题。这里总结一下。关于更多的MySQL真题,你可以直接访问该链接进行查看。 问题描述 我的主机内存只有100G,现在要全扫描一个200G大,会不会把DB主机的内存用光?...所以大扫描,看起来应该没问题。这是为啥呢? 问题分析 全扫描对MySQL服务的影响 假设,我们现在要对一个200G的InnoDBdb1. t,执行一个扫描。...因此,对于正常的线上业务来说,若一个查询的返回结果不多,推荐使用mysql_store_result接口,直接把查询结果保存到本地内存。 当然前提是查询返回结果不多。...如果太多,因为执行了一个大查询导致客户端占用内存近20G,这种情况下就需要改用mysql_use_result接口。...若此时要做一个扫描,会咋样?若要扫描一个200G的,而这个一个历史数据,平时没有业务访问它。 那么,按此算法扫描,就会把当前BP里的数据全部淘汰,存入扫描过程中访问到的数据页的内容。

1.6K20
领券