MySQL中字段字符集不同导致索引不能命中
今天写了一个sql,其中涉及的表中的数据量都差不多为50w左右,查询发现用了8s。这个只是测试服上数据,放到正式服上,肯定一运行就挂了。
SELECTOrders. NO,GuidNo,Orders.CreateTime,sum(OrderItem.Quantity) AS Quantity,Brand. NAME AS BrandName,member.Mobile,Street AS deliveryaddress,Area FROMOrders INNER JOIN OrderItem ON Orders.GuidNo = OrderItem.OrderGuidNo INNER JOIN Brand ON Brand.Id = Orders.BrandId INNER JOIN member ON member.Id = 13 INNER JOIN memberaddress ON member.Id = memberaddress.MemberId WHEREorders.GuidNo IN (SELECTorderpayment.OrderGuidNoFROMpaymentrecordLEFT JOIN orderpayment ON paymentrecord.`No` = orderpayment.PaymentNoWHEREpaymentrecord.PaymentMethod = 'MemberCard'AND paymentrecord.Payer = 13) GROUP BYGuidNo;
然后就用EXPLAIN分析了一下,发现Orders表没有命中索引,但是查询Orders中的GuidNo已经设置了索引,但就是不能命中。
然后我将上面的语句分为两个语句。首先将sql语句修改为:将子查询的数据直接写在了sql中,查询用了0.12s。
SELECTOrders. NO,GuidNo,Orders.CreateTime,sum(OrderItem.Quantity) AS Quantity,Brand. NAME AS BrandName,member.Mobile,Street AS deliveryaddress,Area FROMOrders INNER JOIN OrderItem ON Orders.GuidNo = OrderItem.OrderGuidNo INNER JOIN Brand ON Brand.Id = Orders.BrandId INNER JOIN member ON member.Id = 13 INNER JOIN memberaddress ON member.Id = memberaddress.MemberId WHEREorders.GuidNo IN ('0A499C5B1A82B6322AE99D107D4DA7B8','18A5EE6B1D4E9D76B6346D2F6B836442','327A5AE2BACEA714F8B907865F084503','B42B085E794BA14516CE21C13CF38187','FBC978E1602ED342E5567168E73F0602') GROUP BYGuidNo
第二个:单独运行子查询的Sql,也才用了0.1s
SELECTorderpayment.OrderGuidNoFROMpaymentrecordLEFT JOIN orderpayment ON paymentrecord.`No` = orderpayment.PaymentNoWHEREpaymentrecord.PaymentMethod = 'MemberCard'AND paymentrecord.Payer = 13
这么问题就清晰了,一定是子查询和父查询关联的问题。因为子查询单独很快,父查询用子查询数据直接查的时候也很快,就是在他俩结合的时候很慢。大致能将问题锁定在这两个关联字段OrderGuidNo上。
最后发现 orderpayment 表和 Orders 表字符集是不同的。一个表的字符集是:utf8_general_ci,一个是:utf8mb4_general_ci。(不查不知道,发现一个数据库中,很多表的字符集都不相同)
修改orderpayment表的字符集和表中OrderGuidNo的字符集为:utf8_general_ci
ALTER TABLE orderpayment DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; //修改表的字符集ALTER TABLE orderpayment CHANGE OrderGuidNo OrderGuidNo VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci; //修改字段的字符集
然后在用EXPLAIN分析一下,可以看到都用上了索引。
然后运行,查询了0.112秒。
转载于:https://www.cnblogs.com/MicroHeart/p/9597794.html
MySQL中字段字符集不同导致索引不能命中相关推荐
- mysql普通索引命中_MySQL中因字段字符集不同导致索引不能命中的解决方法
什么是索引?为什么要建立索引? 索引用于快速找出在某个列中有一特定值的行,不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行,表越大,查询数据所花费的时间就越多,如果表中查询的列有 ...
- Mysql中字段类型不一致导致索引无效
修改后 详细见楼下链接 http://ustb80.blog.51cto.com/6139482/1287847 转载于:https://www.cnblogs.com/small8/p/614460 ...
- MySQl中文1001无标题_Mysql中字段类型不一致导致索引无效的处理办法
前两天有个同事算数据,写出来的sql执行很慢.那个sql也很简单,就是一个左联带条件的查询.explain之后发现,其中有一张表没有用到索引.初始以为是没有建索引,于是建上索引再试,发现问题依旧.后来 ...
- MySQL表字段字符集不同导致的索引失效问题
MySQL表字段字符集不同导致的索引失效问题 转自:MySQL表字段字符集不同导致的索引失效问题 1. 概述 昨天在一位同学的MySQL机器上面发现了这样一个问题,MySQL两张表做left join ...
- MySQL 字符集不一致导致索引失效的一个真实案例
文章目录 问题描述 问题分析 总结 大家好,我是只谈技术不剪发的 Tony 老师.今天给大家分析一个由于 MySQL 字符集不一致导致索引失效的案例. 问题描述 有个朋友给我发来一个问题,说是他们的系 ...
- Mysql中SQL语句不使用索引的情况
Mysql中SQL语句不使用索引的情况 MySQL查询不使用索引汇总 众所周知,增加索引是提高查询速度的有效途径,但是很多时候,即使增加了索引,查询仍然不使用索引,这种情况严重影响性能,这里就简单总结 ...
- 七、MySQL中的字符集 - 系统的撸一遍MySQL
2019独角兽企业重金招聘Python工程师标准>>> 什么是字符集? 计算中的字符文字集合(每个自负文字分配一个对应的数字),将字符集中的文字符号进行编码以便于计算机识别处理. 字 ...
- 在mysql中如何为连接添加索引_在MySQL中如何为连接添加索引
http://hackmysql.com/case4 译文: 我先通过一个简单的例子说明在MySQL中如何为连接添加索引,然后再看一个有挑战性的例子. 简单的3个表的连接 表结构很简单,3个表tblA ...
- mysql中基字符集_Mysql中的字符集
1.字符集基础 在计算机的眼中只有0和1,但是在人类世界中却有上百种语言,每种语言又有成千上万的文字,那么如何在计算中表示人类世界中的这些文字呢? 在上个世纪60年代的时候,美国首先定义了一套规则,在 ...
最新文章
- [导入]我翻译的JavaScript文章
- 我们需要现在就进入LTE时代
- C++继承中的普通函数,纯虚函数、虚函数
- 跟着《架构探险》学轻量级微服务架构 (一)
- Windows10+Ubuntu 18.04.2+ROS 安装笔记(SSD单硬盘)上
- 全国大学校园网—拓扑图欣赏
- 两个不同的进程 虚拟地址相同_Linux的进程地址空间[一]
- LeetCode 144. 树的前序遍历迭代写法
- 中缀表达式变后缀分析
- 安卓期末大作业(AndroidStudio开发),日记本app,代码注释详细,能正常运行
- 利用虚拟打印机截取打印文件并上传到服务器
- Redhat 系列漏洞补丁加固
- matlab 模的平方,RSA模重复平方算法小示例
- RTKLIB-学习笔记
- voip系统与网络电话
- Android Vibrator
- UE4 Engine Fix-找回4.24后失去的Matinee
- RuntimeError: cuda runtime error (8) : invalid device function at /pytorch/torch/lib/THC/generic/THC
- 跨境电商平台都有哪些
- 元宇宙 vs. 数字孪生:技术演化的视角