【已解决】mysql left join使用不了索引问题

MySQL left join 查询巨慢 优化 MySQL left join 查询巨慢 优化前景提要功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表 前景提要 最近工作中遇到一个非常奇怪的问题,mysql中有两张表,test_info和test_do_info需要进行LEFT JOIN关联查询,每张表又都1W+的数据,关联查询需要12s之久。 按照常理来说1W+的数据关联查询应该很快,即使进行全表扫描也不至于 阅读详情

前言

在本地建了两张表,一张order表和一张zx表,由于order的用户ID是包含所有我需要的用户,所以用order作为驱动表left join zx表。
事先我在两表内都创建了unique的索引(end_date,ownerid),然后用order表 left join zx表。
——按理说应该适用eq_ref的type,结果却根本没有用上ownerid的索引,使用强制索引也没用,但用zx表 left join order表却能顺利用上。

1.重现问题

具体建表就不说了,默认charset=utf8.
截图如下:
图1.1 order left join zx
图1.1

图1.2 zx left join order
图1.2

很明显,这里有两个问题:
1.图1.1中type是ref,ref里面也只用上了const(常量),并没有用上o.ownerid;
2.图1.1中z表遍历的rows竟然达到56793,事实上这个日期的行数仅有28396行,即使全表也仅是56453行。
这样,能想见图1.1执行会有多慢,基本执行不动了。

2.分析和搜索解决办法

不说分析了,换着法的改sql也没用;换着群问大神也没用;各种搜索引擎搜才总算有点思路。
关键点是“索引用不上的原因可能是字符集不相同”。
于是看了了两张表的字符集,当然都是utf8;
再看看两张表这个字段的字符集:

SHOW FULL COLUMNS FROM initial30_order;
SHOW FULL COLUMNS FROM initial30_zx;

图2.1 order表字符集
图2.1

图2.2 zx表字符集
图2.2

可以看到,zx表的ownerid莫名变成了utf8_general_ci.

3.解决问题

找到问题那么更改order表的ownerid的字符集即可:

ALTER TABLE initial30_order CHANGE ownerid ownerid VARCHAR(11) CHARACTER SET utf8 COLLATE utf8_general_ci

图3.1 更改order表ownerid字段的字符集
图3.1

再执行一下图1.1的sql:
图3.2 重复执行图1.1的sql
图3.2

问题解决。


MySQL 什么时候使用INNER JOIN 或 LEFT JOIN 在本科时期,其实这个问题困扰了我很久,最早都是用如下语句,也就是笛卡尔积的形式。 select ** from A,B where A.name=B.name 再熟悉了各种联表以后其实这就是cross join,是最慢的一种联表方式,会返回A表字段的数据*B表字段的数据(如果A表有10条数据,B表有20条数据,那么最后返回结果就是200条)。 其实可以根据真实的需求用更好的联表操作,如left join 或inner join。 红烧排骨饭博客中给出的例子很容易理解 商品表 CREATE TABLE pr 阅读详情

相关推荐

MySQL LEFT JOIN 性能优化策略

我们现在有一个驱动表customer,它存储客户id、姓名以及出生日期,默认情况下idcustomer有一张关联表,c_id记录着与其关联数据的id,并用记录客户余额,对应DDL假设此时数据库大约有2000w的数据,我们希望查出姓名为的用户的出生日期和可用余额,如果没有记录余额则设置为null,对应我们给出这样一条SQL最终查询结果如下,耗时大约是1s多一些,对于用户而言超过200ms。

禅与计算机程序设计的艺术 1572

查一次left join没有走索引以及原因

线上有个查询sql,原来是inner join 查询没有问题,后来应业务要求改成left join之后, 查询时间就暴涨了 需要长达24s 通过explain分析,发现订单表没有走索引 ,分析之后解决了,记录下来。 为了简洁起见,这里就将无关的查询字段都用* 具体sql如下 SELECT * from t_item_detail a left join t_order_detail d ...

hello world 4万+

【后端百科】mysql的join,left join,right join,full join分别是什么意思

在MySQL数据库中,JOIN操作是一种强大的工具,用于将两个或多个表中的数据进行组合,以满足复杂的查询需求。本文将详细介绍MySQL中的四种主要JOIN类型:INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL OUTER JOIN(虽然MySQL不直接支持FULL OUTER JOIN,但可以通过其他方式实现类似效果),并对它们进行对比分析。MySQL提供了多种类型的JOIN操作,每种JOIN都有其特定的用途和语法。在实际应用中,应根据具体需求选择合适的JOIN类型。

ThisIsClark 1535

left join 索引笔记

sql join 索引测试 基础

史上最强生物的博客 4079

【详细】芯片设计全流程(包括每个流程需要用到的工具以及需要参与的工作人员)

一颗芯片的诞生经历了设计、制造和测试(分别对应集成电路产业链的设计业、制造业和封测业),而每一步都包含了复杂的步骤和流程。 图0-1 集成电路产业链 现在,我们重点介绍芯片设计的全流程以及每个流程需要用到的设计工具和需要参与的工作人员。 一、IC设计分类 首先对IC设计的分类做个介绍,如图1-1所示。 图1-1 IC设计分类 如图1-1所示,IC设计可以粗分为数字IC设计和射频/模拟IC设计,数字IC设计又可分为ASIC设计和FPGA/CPLD设计,此外还有一部分IC设计.

qq_36045093的博客 8万+

Informer:比Transformer更有效的长时间序列预测

目录 AAAI 2021最佳论文:比Transformer更有效的长时间序列预测 Background Why attention Methods:the details of Informer Solve_Challenge_1:最基本的一个思路就是降低Attention的计算量,仅计算一些非常重要的或者说有代表性的Attention即可,一些相近的思路在近期不断的提出,比如Sparse-Attention,这个方法涉及了稀疏化Attention的操作,来减少Attention计算量,然后涉及的

To be a better man 1万+

MySql 多表使用LEFT JOIN 索引失效

1.背景 生产环境一条查询三张表的sql语句,使用left join,查询时间特别长。 2.sql语句 SELECT o1.id, o3.repayment_num, o1.period_num, o2.credit_amount FROM test_o1 o1 LEFT JOIN test_o2 o2 ON o1.credit_num = o2.credit_num LEFT JOIN test_o3 o3 ON o1.period_num = o3.period_num WHERE 1 =

zhangustb 8342

深度学习十大算法之Word2Vec

Word2Vec的提出,标志着词嵌入技术的一次重大进步。Word2Vec是一种高效的词嵌入模型,由Google的研究团队于2013年开发。它使用一种称为神经网络的机器学习方法,通过学习大量文本数据,生成能够表达词语间丰富语义关系的词向量。Word2Vec的核心优势在于它能够捕捉到词语之间的细微关系。例如,在Word2Vec模型中,可以通过计算向量之间的距离来估计词语之间的相似度。这不仅能帮助理解语言的复杂性,还可以应用于各种NLP任务,如机器翻译和搜索引擎优化。

第欧根尼的酒桶的博客 1866

mysql left join没有走索引,确定on的字段都是有索引

今天在开发过程中,用到mysql 的left join,两个表数据都不多,都不超过2万左右条记录。以为是个很轻松的活,select a.*,b.* from a left join b on a.id=b.pid。一运行,傻眼了,卡住了半天没有结果,最后超时了。仔细看了这两个表,a.id还是主键,b.pid也有建索引,百思不得其解,搜了一通,不得要领。继续搜,皇天不负有心人,找到答案原来是要求join on的字段类型要一致才会走索引。a.id主键类型为int,b.pid为varchar。

chwlallen的专栏 974

【车间调度】车间调度问题的分类

本系列为自己学习调度相关知识的记录,如有误请指出,也欢迎调度方向的小伙伴加我好友共同交流。 车间调度问题的分类 根据工件和车间构成不同,车间调度问题可分为以下几种 1.单机调度问题 在单机调度问题(S,SMP)中,加工系统只有一台机床,待加工的工件有且仅有一道工序,所有工件都在该机床上进行加工。此问题是最简单的调度问题,当生产车间出现瓶颈机床时的调度就可视为此调度问题。 ...

weixin_51656605的博客 7430

光纤布拉格光栅(FBG)笔记【1】:波导结构和布拉格波长推导

引言 本文是光纤布拉格光栅(FBG)的笔记【1】,主要介绍了光纤布拉格光栅的波导结构,并且利用动量和能量守恒推导了光纤布拉格波长的表达式 普通光纤中让折射率发生周期性变化就是结构最简单的均匀光纤布拉格光栅(FBG),其波导结构如下图所示。 其传感原理描述可以分为以下的三点: ①光纤纤芯传播的光会在每个光栅面进行反射和透射; ②如果不满足布拉格条件,依次排列的光栅平面反射的光会逐渐变得不同直到最后相互抵消;同时由于系数不匹配,与布拉格波长不相符的光在每个光栅平面的反射也很微弱,这些光大部分在光纤中发生透.

subtitle_的博客 2万+

left join 和inner join 的区别

一.Join查询原理 查询原理:MySQL内部采用了一种叫做 nested loop join(嵌套循环连接)的算法。Nested Loop Join 实际上就是通过驱动表的结果集作为循环基础数据,然后一条一条的通过该结果集中的数据作为过滤条件到下一个表中查询数据,然后合并结果。如果还有第三个参与 Join,则再通过前两个表的 Join 结果集作为循环基础数据,再一次通过循环查询条件到第三个表中查询数据,如此往复,基本上MySQL采用的是最容易理解的算法来实现join。所以驱动表的选择非常重要,驱动表的数据

Nulltu的博客 5万+

同步调相机启动与并网控制技术方案

同步调相机起动与并网控制技术方案采用背靠背变流器系统,通过静止变频器(SFC)策略实现无原动机驱动的同步电机从静止到同步转速的平稳起动。方案详细阐述了硬件自检、模块初始化、转子位置检测等关键环节,重点解决启动转矩为零、冲击电流大等挑战。系统基于STM32或C2000系列控制器,包含网侧/机侧变流器、检测保护单元及通信接口,通过励磁脉冲和电压响应分析实现高精度转子初始定位,为后续并网提供必要条件。代码级实现涵盖了ADC自检、数字IO验证及通信端口测试等核心功能。

huanghm88的专栏 307

mysql left join使用不了索引问题

前言 在本地建了两张表,一张order表和一张zx表,由于order的用户ID是包含所有我需要的用户,所以用order作为驱动表left join zx表。 事先我在两表内都创建了unique的索引(end_date,ownerid),然后用order表 left join zx表。 ——按理说应该适用eq_ref的type,结果却根本没有用上ownerid的索引,使用强制索引也没用,但用zx表 left join order表却能顺利用上。 1.重现问题 具体建表就不说了,默认charset=utf..

u012045045的博客 1336

QT+Halcon实现螺纹检测

工业上要检测螺丝的内外直径、内外牙距、内外角度,现在比较好用的图像处理库,开源的opencv,收费的有halcon。为了实现螺纹检测,和对比螺纹检测拿个库比较好。分别用opencv和halcon实现了螺纹检测,通过对比发现用halcon实现的效果比较。现在用博客把实现过程记录下来: 1、需要检测的螺纹数据如下: 2、为了实现检测螺丝以上数据,螺纹内径、螺纹外径、螺纹外牙距、螺纹...

专注现代C++实战,从核心语法到高性能编程,助力开发者深入掌握系统级编程精髓。 7051

从 Material Requirements Planning 看 SAP 物料计划的底层控制逻辑

文章摘要:SAP中的MRP(物料需求计划)不仅仅是运行一个程序(如MD01N),其关键在于主数据和组织层级的正确配置。MRP的核心是解决"何时需要多少物料"的问题,涉及采购、生产、库存等多种供应来源。物料主数据的MRP视图必须在组织层级(如工厂、存储位置)下维护,不同层级的计划逻辑可能完全不同。S/4HANA更强调MRP Area作为细分计划单位,取代传统存储位置MRP。实施时需注意MRP Profile的合理使用,避免批量错误,并特别关注物料生命周期管理(如停用物料和替代件),这些因素共同决定了MRP能否

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1412

mysql 左连接 怎么走索引_mysql join 和left join 对于索引的问题

今天遇到一个left join优化的问题,搞了一下午,中间查了不少资料,对MySQL的查询计划还有查询优化有了更进一步的了解,做一个简单的记录:select c.* from hotel_info_original cleft join hotel_info_collection hon c.hotel_type=h.hotel_type and c.hotel_id =h.hotel_idwhe...

weixin_39793708的博客 4459

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

MySQL 中如何解决深度分页的问题?& MySQL中 join、inner join、left join、right join区别

方法优点缺点适用场景子查询 + 覆盖索引支持跳页,通用性强依赖联合索引设计需频繁分页且允许跳页记录最大 ID性能最优,复杂度低仅支持连续分页连续分页(如瀑布流)适合复杂搜索,分布式性能好维护成本高,ES 需额外学习高并发搜索+分页场景核心要点索引设计是优化基础,确保覆盖索引和排序字段匹配。权衡业务需求,优先选择游标分页(记录max_id)或延迟关联(子查询)。搜索引擎适用于复杂查询,但引入额外组件需评估成本。

DolphinHome的博客 1361

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

mysql inner join 索引_mysql join 和left join 对于索引的问题

今天遇到一个left join优化的问题,搞了一下午,中间查了不少资料,对MySQL的查询计划还有查询优化有了更进一步的了解,做一个简单的记录:select c.* from hotel_info_original cleft join hotel_info_collection hon c.hotel_type=h.hotel_type and c.hotel_id =h.hotel_idwhe...

weixin_42402664的博客 2064

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

mysql join 和left join 对于索引的问题

mysql join 和left join 对于索引的问题  今天遇到一个left join优化的问题,搞了一下午,中间查了不少资料,对MySQL的查询计划还有查询优化有了更进一步的了解,做一个简单的记录:  select c.* from hotel_info_original c  left join hotel_info_collection h  on c.

u010412301的博客 1301

mysql left join效率_mysql 如何优化left join

今天遇到一个left join优化的问题,搞了一下午,中间查了不少资料,对MySQL的查询计划还有查询优化有了更进一步的了解,做一个简单的记录: select c.* from hotel_info_original c left join hotel_info_collection h on c.hotel_type=h.hotel_type and c.hotel_id =h.hotel_id where h.hotel_id is null 这个sql是用来查询出c表中有h表中无的记录,所以

lz610756247的专栏 7419

mysql 如何优化left join

今天遇到一个left join优化的问题,搞了一下午,中间查了不少资料,对MySQL的查询计划还有查询优化有了更进一步的了解,做一个简单的记录:select c.* from hotel_info_original cleft join hotel_info_collection hon c.hotel_type=h.hotel_type and c.hotel_id =h.hotel_i...

weixin_34071713的博客 8861

从EXPLAIN看MySQL JOIN优化:为什么你的LEFT JOIN比INNER JOIN还慢?

本文深入探讨MySQL中LEFT JOIN比INNER JOIN慢的原因,重点分析驱动表选择机制及JOIN算法差异。通过EXPLAIN执行计划解析,揭示索引、WHERE条件和统计信息如何影响优化器决策,并提供实用的索引优化、参数调优和查询重写策略,帮助开发者解决实际性能问题。

868

mysql join 指定索引_mysql join 和left join 对于索引的问题

今天遇到一个left join优化的问题,搞了一下午,中间查了不少资料,对MySQL的查询计划还有查询优化有了更进一步的了解,做一个简单的记录:select c.* from hotel_info_original cleft join hotel_info_collection hon c.hotel_type=h.hotel_type and c.hotel_id =h.hotel_idwhe...

weixin_35672450的博客 967

数据库面试必备:MySQL中INNER JOIN、LEFT JOIN和RIGHT JOIN的区别详解

在MySQL数据库操作中,JOIN操作是最常用且最重要的功能之一,它允许我们从多个表中获取相关联的数据。本文将详细解释INNER JOIN、LEFT JOIN和RIGHT JOIN这三种主要JOIN类型的区别,并通过实例和图表演示它们的工作原理。

qq_58299462的博客 1473
下一篇: 从互联网数据分析师技能掌握要求角度看数据平台架构演变
everda
博客等级 码龄12年 5粉丝 4原创
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值