什么是索引?为什么要建立索引?

索引用于快速找出在某个列中有一特定值的行,不使用索引,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中因字段字符集不同导致索引不能命中的解决方法相关推荐

  1. MySQL中字段字符集不同导致索引不能命中

    今天写了一个sql,其中涉及的表中的数据量都差不多为50w左右,查询发现用了8s.这个只是测试服上数据,放到正式服上,肯定一运行就挂了. SELECTOrders. NO,GuidNo,Orders. ...

  2. mysql 回表查询优化_MySQL中的回表查询与索引覆盖:一次百万级别分页查询使用Limit 从90秒到0.6毫秒的优化...

    这里写目录标题 事故现场 解决方案 提到的"回表查询" InnoDB的索引 什么是回表查询 怎么优化回表查询 事故现场 数据库使用的MySQL,有一个日志表,需要进行分页查询,于是 ...

  3. Mysql多表关联时因关联字段类型不一致导致索引失效及查询错误

    两表关联时,因关联字段类型不一致导致的问题. 问题1. 索引失效. 问题2. 查询错误. 关联查询时int 类型的1与varchar类型的'001' 可匹配. 解决问题:利用cast(字段 as 字段 ...

  4. mysql子查询走索引吗_MySQL中in子查询会导致无法使用索引问题(转)

    MySQL的测试环境 测试表如下 create tabletest_table2 ( idint auto_increment primary key, pay_idint, pay_timedate ...

  5. mysql int 正数 范围_mysql中整数字段不同类型的取值范围

    mysql数据库设计,其中,对于数据性能优化,字段类型考虑很重要,整数(int)字段类型分有符号和无符号两种(UNSIGNED属性就是将数字类型无符号化,与C.C++这些程序语言中的unsigned含 ...

  6. mysql支不支持fulljoin_MySQL5中是否可以进行完整外连接查询(full join)?解决方法

    mysql5中是否可以进行完整外连接查询(full join)? 在MySQL5中建立如下表: create   table   table1(id1   int,name   varchar(10) ...

  7. mysql获取当月最后一天_mysql中获取本月第一天、本月最后一天、上月第一天、上月最后一天

    mysql获取当月最后一天_mysql中获取本月第一天.本月最后一天.上月第一天.上月最后一天等等 转自: https://blog.csdn.net/min996358312/article/det ...

  8. mysql数据库,oracle数据库中对字段的拼接方法

    mysql数据库,oracle数据库中对字段的拼接方法 1.简介 在日常开发中,常常有将多个字段拼接进行sql操作的场景,比如做模糊查询,我这里分两种环境阐述:1.在数据库中的写法:2.在mybati ...

  9. MySQL 字符集不一致导致索引失效的一个真实案例

    文章目录 问题描述 问题分析 总结 大家好,我是只谈技术不剪发的 Tony 老师.今天给大家分析一个由于 MySQL 字符集不一致导致索引失效的案例. 问题描述 有个朋友给我发来一个问题,说是他们的系 ...

最新文章

  1. 竟有内鬼!北理工硕士生「复制粘贴」论文,旷视研究员最新声明
  2. 【推荐】R for Data Science 新书抢先看
  3. 异常记录(CPU产生的异常和软件模拟产生的异常)
  4. Cloud for Customer系统里的附件url,可以通过partner编程自己生成么?
  5. python numpy.random模块中提供啦大量的随机数相关的函数
  6. RocketMQ 端云一体化设计与实践
  7. linux常见基础服务,常用的linux命令的基本使用(一)
  8. CentOS8 模块化仓库
  9. 【BZOJ1499】【NOI2005】瑰丽华尔兹(动态规划)
  10. 688561,安全新代码!
  11. 开源与安全兼备 IBM LinuxONE轻松掌控关键业务
  12. 解决Agent admitted failure to sign using the kye with ssh
  13. Java Web开发入门 - 第2章 HTTP协议单元作业
  14. Java RMI之介绍
  15. 5.分布式服务架构:原理、设计与实战 --- 基于调用链的服务治理系统的设计与实现
  16. TIPS:java 类的全局变量与静态变量
  17. Flash遮罩——水波、瀑布
  18. 2022保密教育线上培训考试参考答案 05
  19. html gif 透明通道,164个loading图片gif格式-透明背景
  20. android 新浪微博分享提示签名错误,Android ShareSDK 微博分享 (8995)app auth fail for appKeysignpackage 解决...

热门文章

  1. http协议的网页加载不出来的问题【其一】
  2. 马云计算机图片大全集,五福图片扫福字原图最新图片 马云的福字特殊福字图片大全...
  3. 网络机顶盒哪个好?实测60天后盘点网络电视机顶盒排名
  4. Xcode如何添加字体库--
  5. G-S迭代求解线性方程,以及三对角矩阵求解
  6. 2020年网络游戏实名认证,走出合规发展之路
  7. springboot使用sm2加密传输
  8. win7怎样将便签内容添加到桌面
  9. Animate软件常用快捷键(MAC+Windows)
  10. 一个IT从业人员的职业道德与素养