mysql普通索引命中_MySQL中因字段字符集不同导致索引不能命中的解决方法
什么是索引?为什么要建立索引?
索引用于快速找出在某个列中有一特定值的行,不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行,表越大,查询数据所花费的时间就越多,如果表中查询的列有一个索引,MySQL能够快速到达一个位置去搜索数据文件,而不必查看所有数据,那么将会节省很大一部分时间。
例如:有一张person表,其中有2W条记录,记录着2W个人的信息。有一个Phone的字段记录每个人的电话号码,现在想要查询出电话号码为xxxx的人的信息。
如果没有索引,那么将从表中第一条记录一条条往下遍历,直到找到该条信息为止。
如果有了索引,那么会将该Phone字段,通过一定的方法进行存储,好让查询该字段上的信息时,能够快速找到对应的数据,而不必在遍历2W条数据了。其中MySQL中的索引的存储类型有两种:BTREE、HASH。 也就是用树或者Hash值来存储该字段,要知道其中详细是如何查找的,就需要会算法的知识了。我们现在只需要知道索引的作用,功能是什么就行。
引言
今天写了一个sql,其中涉及的表中的数据量都差不多为50w左右,查询发现用了8s。这个只是测试服上数据,放到正式服上,肯定一运行就挂了。
SELECT
Orders. NO,
GuidNo,
Orders.CreateTime,
sum(OrderItem.Quantity) AS Quantity,
Brand. NAME AS BrandName,
member.Mobile,
Street AS deliveryaddress,
Area
FROM
Orders
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
WHERE
orders.GuidNo IN (
SELECT
orderpayment.OrderGuidNo
FROM
paymentrecord
LEFT JOIN orderpayment ON paymentrecord.`No` = orderpayment.PaymentNo
WHERE
paymentrecord.PaymentMethod = 'MemberCard'
AND paymentrecord.Payer = 13
)
GROUP BY
GuidNo;
然后就用EXPLAIN分析了一下,发现Orders表没有命中索引,但是查询Orders中的GuidNo已经设置了索引,但就是不能命中。
解决过程
然后我将上面的语句分为两个语句。首先将sql语句修改为:将子查询的数据直接写在了sql中,查询用了0.12s。
SELECT
Orders. NO,
GuidNo,
Orders.CreateTime,
sum(OrderItem.Quantity) AS Quantity,
Brand. NAME AS BrandName,
member.Mobile,
Street AS deliveryaddress,
Area
FROM
Orders
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
WHERE
orders.GuidNo IN (
'0A499C5B1A82B6322AE99D107D4DA7B8',
'18A5EE6B1D4E9D76B6346D2F6B836442',
'327A5AE2BACEA714F8B907865F084503',
'B42B085E794BA14516CE21C13CF38187',
'FBC978E1602ED342E5567168E73F0602'
)
GROUP BY
GuidNo
第二个:单独运行子查询的Sql,也才用了0.1s
SELECT
orderpayment.OrderGuidNo
FROM
paymentrecord
LEFT JOIN orderpayment ON paymentrecord.`No` = orderpayment.PaymentNo
WHERE
paymentrecord.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秒。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。
mysql普通索引命中_MySQL中因字段字符集不同导致索引不能命中的解决方法相关推荐
- MySQL中字段字符集不同导致索引不能命中
今天写了一个sql,其中涉及的表中的数据量都差不多为50w左右,查询发现用了8s.这个只是测试服上数据,放到正式服上,肯定一运行就挂了. SELECTOrders. NO,GuidNo,Orders. ...
- mysql 回表查询优化_MySQL中的回表查询与索引覆盖:一次百万级别分页查询使用Limit 从90秒到0.6毫秒的优化...
这里写目录标题 事故现场 解决方案 提到的"回表查询" InnoDB的索引 什么是回表查询 怎么优化回表查询 事故现场 数据库使用的MySQL,有一个日志表,需要进行分页查询,于是 ...
- Mysql多表关联时因关联字段类型不一致导致索引失效及查询错误
两表关联时,因关联字段类型不一致导致的问题. 问题1. 索引失效. 问题2. 查询错误. 关联查询时int 类型的1与varchar类型的'001' 可匹配. 解决问题:利用cast(字段 as 字段 ...
- mysql子查询走索引吗_MySQL中in子查询会导致无法使用索引问题(转)
MySQL的测试环境 测试表如下 create tabletest_table2 ( idint auto_increment primary key, pay_idint, pay_timedate ...
- mysql int 正数 范围_mysql中整数字段不同类型的取值范围
mysql数据库设计,其中,对于数据性能优化,字段类型考虑很重要,整数(int)字段类型分有符号和无符号两种(UNSIGNED属性就是将数字类型无符号化,与C.C++这些程序语言中的unsigned含 ...
- mysql支不支持fulljoin_MySQL5中是否可以进行完整外连接查询(full join)?解决方法
mysql5中是否可以进行完整外连接查询(full join)? 在MySQL5中建立如下表: create table table1(id1 int,name varchar(10) ...
- mysql获取当月最后一天_mysql中获取本月第一天、本月最后一天、上月第一天、上月最后一天
mysql获取当月最后一天_mysql中获取本月第一天.本月最后一天.上月第一天.上月最后一天等等 转自: https://blog.csdn.net/min996358312/article/det ...
- mysql数据库,oracle数据库中对字段的拼接方法
mysql数据库,oracle数据库中对字段的拼接方法 1.简介 在日常开发中,常常有将多个字段拼接进行sql操作的场景,比如做模糊查询,我这里分两种环境阐述:1.在数据库中的写法:2.在mybati ...
- MySQL 字符集不一致导致索引失效的一个真实案例
文章目录 问题描述 问题分析 总结 大家好,我是只谈技术不剪发的 Tony 老师.今天给大家分析一个由于 MySQL 字符集不一致导致索引失效的案例. 问题描述 有个朋友给我发来一个问题,说是他们的系 ...
最新文章
- 竟有内鬼!北理工硕士生「复制粘贴」论文,旷视研究员最新声明
- 【推荐】R for Data Science 新书抢先看
- 异常记录(CPU产生的异常和软件模拟产生的异常)
- Cloud for Customer系统里的附件url,可以通过partner编程自己生成么?
- python numpy.random模块中提供啦大量的随机数相关的函数
- RocketMQ 端云一体化设计与实践
- linux常见基础服务,常用的linux命令的基本使用(一)
- CentOS8 模块化仓库
- 【BZOJ1499】【NOI2005】瑰丽华尔兹(动态规划)
- 688561,安全新代码!
- 开源与安全兼备 IBM LinuxONE轻松掌控关键业务
- 解决Agent admitted failure to sign using the kye with ssh
- Java Web开发入门 - 第2章 HTTP协议单元作业
- Java RMI之介绍
- 5.分布式服务架构:原理、设计与实战 --- 基于调用链的服务治理系统的设计与实现
- TIPS:java 类的全局变量与静态变量
- Flash遮罩——水波、瀑布
- 2022保密教育线上培训考试参考答案 05
- html gif 透明通道,164个loading图片gif格式-透明背景
- android 新浪微博分享提示签名错误,Android ShareSDK 微博分享 (8995)app auth fail for appKeysignpackage 解决...