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

MySQL实战十八讲-为什么这些SQL语句逻辑相同,性能却差异巨大?

MySQL 中,有很多看上去逻辑相同,但性能却差异巨大的 SQL 语句。对这些语句使用不当的话,就会不经意间导致整个数据库的压力变大。 我今天挑选了三个这样的案例和你分享。...比如,对于 select * from tradelog where id + 1 = 10000 这个 SQL 语句,这个加 1 操作并不会改变有序性,但是 MySQL 优化器还是不能用 id 索引快速定位到...如下 图3 所示为 MySQL 中字符串和数字转换的效果示意图: 从图中可知,select “10” > 9 返回的是 1,所以你就能确认 MySQL 里的转换规则了:在 MySQL 中,字符串和数字做比较的话...最理想的情况是,MySQL 看到字段 b 定义的是 varchar(10),那肯定返回空呀。可惜,MySQL 并没有这么做。...但实际上,MySQL 也不是这么做的。 这条 SQL 语句的执行很慢,流程是这样的: 1. 在传给引擎执行的时候,做了字符截断。

38320

故障分析 | MySQL 相同 SQL 不同环境执行时间不一样案例分析

作者:付祥现居珠海,主要负责 Oracle、MySQL、mongoDB 和 Redis 维护工作。本文来源:原创投稿*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。...---1、问题现象开发反馈同一条SQL在qa环境执行需要0.1s,而在dev环境需要0.3~0.5s,SQL如下:SELECT machine.id, machine.asset_number...为何相同SQL不同环境执行计划不一样,带着这个疑问做了如下操作:2.1、检查表、索引、数据分布结果:基本一致2.2、重新收集统计信息     结果:重新收集了dev环境表machine、ci统计信息,...Prior to MySQL 5.7.33, it ws not possible to disable this optimization, but in MySQL 5.7.33 and later...2.5、分析SQL、改写SQL为了排除干扰,将无关紧要left join表去掉,简化SQL如下: SELECT * FROM CMDB_PHYSICAL_MACHINE machine

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

MySQL深入学习第十八篇-为什么这些SQL语句逻辑相同,性能却差异巨大?

MySQL 中,有很多看上去逻辑相同,但性能却差异巨大的 SQL 语句。对这些语句使用不当的话,就会不经意间导致整个数据库的压力变大。 我今天挑选了三个这样的案例和你分享。...比如,对于 select * from tradelog where id + 1 = 10000 这个 SQL 语句,这个加 1 操作并不会改变有序性,但是 MySQL 优化器还是不能用 id 索引快速定位到...从图中可知,select “10” > 9 返回的是 1,所以你就能确认 MySQL 里的转换规则了:在 MySQL 中,字符串和数字做比较的话,是将字符串转换成数字。...最理想的情况是,MySQL 看到字段 b 定义的是 varchar(10),那肯定返回空呀。可惜,MySQL 并没有这么做。...但实际上,MySQL 也不是这么做的。 这条 SQL 语句的执行很慢,流程是这样的: 1. 在传给引擎执行的时候,做了字符截断。

48410

TiDB 在平安核心系统的引入及应用

所以在我们引入前从以下六个方面分别对 TiDB 进行测试验证,其中功能与架构、配置与管理、备份与恢复都是针对我们运维管理,SQL 特性、基准测试、应用场景测试则是应对业务需求和业务场景的。...这是 TiDB 官网最新的架构图: [1240] 从左至右看,可以通过 MySQLMySQL 客户端接入 TiDB,TiDB 有 TiDB、PD、TiKV 三个组件,组件之间功能相互独立,需独立部署...SQL 特性 兼容 mysql 语法,2.0 版本不支持窗口函数、分区表、视图、trigger 等。 [1240] [1240] 3....(3) Spring 框架下 TiDB 事务 [image] 这个问题是比较重要的问题,有个产品需要生成一个唯一的保单号,业务是批量生成的,当时在 TiDB 中我们建了一个表,表中只有一条数据,但是我们发现会有重复保单号出来...原因:TiDB 使用乐观事务模型,在高并发执行 Update 语句对同一条记录更新时,不同事务拿的版本值可能是相同的,由于不同事务只有在提交时,才会检查冲突,而不是像 Oracle、MySQL、PG 那样

85520

07-08 创建计算字段使用函数处理数据第7章 创建计算字段第8章 使用函数处理数据

从客户端(如应用程序)来看,计算字段的数据与其他列的数据的返回方式相同。 提示:客户端与服务器的格式 在 SQL 语句内可完成的许多转换和格式化工作都可以直接在客户端应用程序内完成。...在 SQL 中的 SELECT 语句中,用特殊操作符拼接两个列。根据 DBMS,此操作符可用加号(+)或两个竖杠(||)表示。 在 MySQL 和 MariaDB 中,必须使用特殊的函数。...为正确返回格式化的数据,必须去掉这些空格,使用 SQL 的 RTRIM()函数来完成: SELECT RTRIM(vend_name) + '(' + RTRIM(vend_country) + ')'...RTRIM():去掉字符串右边的空格 LTRIM():去掉字符串左边的空格 TRIM():去掉字符串左右两边的空格 使用别名 从输出可以看到,SELECT 语句可以很好地拼接地址字段。...下面的 SQL 语句检索订单号 20008 中的所有物品: SELECT prod_id, quantity, item_price FROM OrderItems WHERE order_num =

3.7K20

SQL 必知必会 50 题(26 - 30)

SELECT MAX(prod_price) AS max_price FROM Products WHERE prod_price <= 10; SQL27 返回每个订单号各有多少行数 描述 OrderItems...表包含每个订单的每个产品 order_num a002 a002 a002 a004 a007 问题 编写 SQL 语句,返回每个订单号(order_num)各有多少行数(order_lines),...有 3 行订单记录也是最多的订单号故排在最后一位返回,相同订单行数的订单无需过多处理。...order_num quantity a1 105 a2 1100 a2 200 a4 1121 a5 10 a2 19 a7 5 问题 请编写 SQL 语句,返回订单数量总和不小于 100 的所有订单号...,('a4',2,1121),('a5',5,10),('a2',1,19),('a7',7,5); 解答 以上几题都已经将知识点讲过了,这题只是综合运用,主要涉及如下: SUM():对同一产品的总价求和

73030

MySQL进阶篇(03):合理的使用索引结构和查询

位; 如果是并发业务,很多时间节点相同,则索引长度是时间点+标识位; 注意:如果业务允许的情况下,一般要求前缀索引的长度有唯一性,例如上面的时间和标示位。...1、单列查询 这里直接查询主键索引,MySQL的主键一般选择自增,所以速度非常快。...这里有一个基本策略,如果非要在单列索引上做操作,可以将该逻辑放在程序中,到MySQL层面,SQL语句越干净利落越好。...中真的非常复杂,非专业的DBA(就是指开发人员),基本要熟练常见的索引结构,待过两年所谓的大厂,每个版本开发涉及的核心表SQL都是有专业DBA验收,复杂的查询都是提交需求,DBA直接输出查询SQL,当然在一般公司是没有.../mysql-data-base

73610

美团团购订单系统优化记

给定订单号的情况下,单次查询由原来2条SQL变为1条,查询量减少50%,极大提升了系统高并发下性能。 2. 传输优化 当时订单业务主要用PHP编码,直连数据库。...通过这一层严格控制与数据库的连接,SQL的执行。在foundation的上层,作为下单逻辑处理层,在这里我们部署了物理隔离的两套系统,分别作为普通订单请求和促销订单(节日大促等不稳定流量)请求服务。...查询部分: 和下单部分类似,分为两层结构,上层根据不同业务请求和重要性进行了物理隔离。 ? 发券部分: ?...与此同时,相同的消息到达W的10秒延时队列后,经过10秒时间,被投递到MQ_W队列,被发券W服务拿到。...去掉一些细节部分,全景如下: ? 稳定性保障 目前,订单系统服务化已完成,从上述模块部署图中可以看出,架构设计中充分考虑了隔离、降级等容灾措施。具体从以下几个方面说明: 开发、测试。

1.9K51

mysql-proxy 简介

# 背景 今天同事分享的主题就是mysql-proxy,于是下来自己了解下,不求精通,只求知道这个玩意 # 简介 mysql-proxy是mysql官方提供的mysql中间件服务,上游可接入若干个mysql-client...所以说,根本上,mysql-proxy是一个官方提供的框架,具备良好的扩展性,可以用来完成: sql拦截与修改 性能分析与监控 读写分离 请求路由 # 用途 1....分享的同事使用proxy的目的是,因为测试环境碰到了测试/开发同学不小心全表update/delete操作,导致测试数据异常,从而影响项目进度,于是他接入mysql-proxy对sql语句进行了拦截检查...,并可以将sql语句发送到DBA提供的一个sql review服务中去判断sql语句是否有问题 2....之前还有这么一段经历,之前订单经过拆库操作,订单表分为了128个库,是根据订单号去拆库的,然而不是所有的表都有订单号(历史架构的锅),如有个需求是根据手机号码去查询订单号,导致要遍历查询128去判断是否存在

1.3K50

面试系列-避免死锁

这里要注意一下,MySQL 数据库和Oracle 提交事务不太一样,MySQL 数据库默认情况下是自动提交事务,我们可以通过以下命令行查看自动提交事务是否开启: mysql> show variables...,先是通过订单号检查订单是否存在,如果不存在则新增订单记录。...试想下,如果是两个订单号一样的请求同时进来,就有可能出现幻读。...也就是说,一开始事务A 中的查询没有该订单号,后来事务 B 新增了一个该订单号的记录,此时事务 A 再新增一条该订单号记录,就会创建重复的订单记录。面对这种情况,我们可以使用锁间隙算法来防止幻读。...在编程中尽量按照固定的顺序来处理数据库记录,假设有两个更新操作,分别更新两条相同的记录,但更新顺序不一样,有可能导致死锁; 2.

46610

千万级支付对账系统怎么玩(下篇)?

数据导入DP 在 DP 核对之前,我们需要将对账系统收集的数据,从 MySQL 导入 DP Hive 表中。...DP_1_DAYS_AGO_Ymd 代表当前日期的前一天 主要逻辑非常简单,利用 sql 内连接查询的功能,可以查找单号,金额,渠道编码一致的数据。...成功数据核对任务结束,将会把刚才在 DP 中创建的 pay_check_success 同步回对账系统的 MYSQL 数据库中。...这里记为渠道存疑数据,orderType 为 1 成功数据核对以及存疑数据核对结束,DP 平台将会自动把数据从 Hive 表中导入到 MYSQL。...这里逻辑简单解释为,就是利用 Scala 脚本代码对数据进行相关求和,这里代码没有普遍性,就不展示具体的逻辑了。 差错数据推送 数据汇总结束之后,开始下一个阶段,差错数据推送给差错系统。

73720

面试官:谈一谈如何避免重复下单?

难以用SQL条件定义到底什么是“重复订单” 订单的用户、商品、价格一样就是重复订单? 万一这用户就是连续下了俩一模一样订单呢?...2.1.2 每次处理完请求后,须有记录标识该请求已被处理 在 MySQL 中记录一个状态字段。如支付之前记录一条这个订单的支付流水。...MySQL 的主键自带唯一性约束,若在一条 INSERT 语句提供主键,且该主键值在表中已存在,则该条 INSERT 会执行失败。...”的过程须在同一事务执行 UPDATE orders set tracking_number = 666, version = version + 1 WHERE version = 8; 在这条 SQL...这时即使重试的 666 请求再来,因为它和上一条 666 请求带相同版本号,上一条请求更新成功后,这个版本号已经变了,所以重试请求的更新必然失败 无论哪种情况,DB 中的数据与页面上给用户的反馈都是一致的

48020

千万级支付对账系统是怎么设计的?

那主要原因是因为发生在系统架构上,当前系统使用底层使用 MySQL 处理的。...DP 平台提供功能如下: 数据双向离线同步,MySQL 与 Hive 互相同步 大数据离线计算,支持SQL(SparkSQL/HiveSQL/Presto)形式处理各类的数据清洗、转化、聚合操作,也支持使用...如果在本端/对端数据中找到,这里还需要再对比一下金额: 如果金额不相等,代表单号相同,但是金额不等,将这笔移动到支付差异表 如果金额相等,代表这两笔核平,存疑表将这笔数据更新为核对成功,本端/对端数据更新为对账成功...DP_1_DAYS_AGO_Ymd 代表当前日期的前一天 主要逻辑非常简单,利用 SQL 内连接查询的功能,可以查找单号,金额,渠道编码一致的数据。...这里逻辑简单解释为,就是利用 Scala 脚本代码对数据进行相关求和,这里代码没有普遍性,就不展示具体的逻辑了。

2.3K11

分库分表之拆分键设计

本文将探讨如何根据业务需求和数据访问模式选择合适的拆分键,以实现数据库架构的优化,保证系统的高性能和高可用性。...如一个简单的电商数据库,在业务初期,为了快速验证业务模式,把用户、商品、订单都放到一个数据库中,随着业务的发展及用户量的增长,单数据库逐渐不能支撑业务(MySQL中单记录容量超过1K时,单表数据量建议不超过一千万条...对于用户来说仅能看到订单信息,订单上展示的物流信息用户也是通过订单号查询而来;但对于物流系统来说,其系统里的业务主键(拆分键)是运单号,此时,运单号如果和订单号相同,即可完美解决这一问题。...订单表的索引法查询表模型如下: 索引表: 非拆分键查询条件 拆分键 用户编码 订单号单号单号 3、 基因法: 拆分键与非拆分键的单号生成规则中,存在相同规则的部分且该部分被用作拆分键来进行库表的定位...1、 数据库自增主键 在并发量不大的情况下,我们可以使用MySQL数据库里的自增主键来实现拆分键。

13110

MySQL中的SQL优化建议那么多,该如何有的放矢

首先通过SQL看下逻辑情况,整体的逻辑是按照用户id去查询两个数据源(trade_order和virtual_order),从两个数据源查询出10条单号数据返回。...这个用户在两个数据源中可能有单号,也可能没有,只要有匹配的就返回,累计返回10条,看起来是为了去重才选择了union的组合方式。...查询语句里面使用了order_time但是数据返回压根没有用到,建议去掉 SQL层面承载了太多的数据处理压力,比如多数据源,去重和过滤,分页,是不是可以做下精简。...其实这个时候问题的边界都很清晰了,SQL语句很简单,索引也存在,走了全表扫描,在MySQL中可以暂时排除直方图的影响,目前在5.7版本中还不存在直方图的特性,那么结果只有一个:字段的类型产生了隐式类型转换...这个部分可以参考这篇的一篇文章 MySQL中需要重视的隐式转换 比如初始化语句如下: create table test(id int primary key,name varchar(20) ,key

64931

解锁MySQL group_concat的无限可能性:解决长度限制并实现高效查询

第一部分:MySQL的GROUP_CONCAT函数 1.1 GROUP_CONCAT简介 MySQL的GROUP_CONCAT函数是一种强大的聚合函数,通常用于将多个行合并为一个字符串。...1.2 GROUP_CONCAT的应用场景 GROUP_CONCAT的应用场景非常广泛,包括但不限于: 将某个用户的所有订单号以逗号分隔显示。 列出一个论坛帖子的所有回复。...2.2 全局修改GROUP_CONCAT的长度限制 如果你希望对整个MySQL服务器进行全局的修改,可以修改MySQL配置文件(通常是my.cnf或my.ini)。...假设我们有一个订单表,我们想要列出每个客户的所有订单号。...3.1 使用GROUP_CONCAT 首先,让我们看一下如何使用GROUP_CONCAT来列出每个客户的订单号: import java.sql.Connection; import java.sql.DriverManager

2.8K30
领券