mysql sql优化方法_一个MySql Sql 优化技巧分享

2023-11-19

有天发现一个带inner join的sql 执行速度虽然不是很慢(0.1-0.2),但是没有达到理想速度。两个表关联,且关联的字段都是主键,查询的字段是唯一索引。

sql如下:

SELECTp_item_token.*,

p_item.product_typeFROMp_item_tokenINNER JOIN p_item ON p_item.itemid =p_item_token.itemidWHEREp_item_token.token='db87a780427d4d02ba2bd49fac8xxx';

其中表  p_item_token  中  itemid 是主键, token 是唯一索引。 p_item 中itemid 是主键

按照理想速度,应该在0.03s左右正常。但实际为0.2左右,慢了不少。

直接 EXPLAIN 看计划

1 EXPLAIN2 SELECT

3 p_item_token.*,4 p_item.product_type5 FROM

6 p_item_token7 INNER JOIN p_item ON p_item.itemid =p_item_token.itemid8 WHERE

9 p_item_token.token = 'db87a780427d4d02ba2bd49fac8xxx';

结果:

a9df6616aef1eaa2620cd935862e2cde.png

注意看上面大红框。p_item表中就是2w条数据,那这个就是全表扫描了。

不正常啊。

加个show warnings 看看。注意:有些情况下SHOW WARNINGS 会没有结果。我还不知道原因。建议用本地测试数据库运行。

1 EXPLAIN2 SELECT

3 p_item_token.*,4 p_item.product_type5 FROM

6 p_item_token7 INNER JOIN p_item ON p_item.itemid =p_item_token.itemid8 WHERE

9 p_item_token.token = 'db87a780427d4d02ba2bd49fac8xxx';10

11 SHOW WARNINGS;

1551c497b6dd43f83587306c1374fe08.png

结果2里面显示code=1003.后面有个sql语句。这个语句就是mysql把我们输入的sql语句,按照规则改写之后执行的最终语句。

1 /*select#1*/

2 SELECT

3 '0000eb612d78407a91a9b3854ffffffff' AS `itemid`, /*注:直接按主键把值查出来了*/

4 'db87a780427d4d02ba2bd49fac8cf98b' AS `token`,

5 '2016-12-16 10:46:53' AS `create_time`,

6 '' AS `ftoken`,

7 `p_db`.`p_item`.`product_type` AS `product_type`

8 FROM

9 `p_db`.`p_item_token`10 JOIN`p_db`.`p_item`11 WHERE

12 (13 (14 CONVERT(15 `p_db`.`p_item`.`itemid` USING utf8mb416 ) = '0000eb612d78407a91a9b3854fffffff'

17 )18 )

奇怪啊。Where中怎么有个 CONVERT ?我们知道,如果where条件中,等式的左边,也就是要查询的字段上有函数的话,就会导致慢。(我的理解:慢因为索引用不到了。索引的值是原始值,这个条件中用的却是处理后的值。)

注意看这函数,意思是把 itemid 这一列的编码转换成 utf8mb4 .

也就是说,这一列的编码不是 utf8mb4 !

也就是,两个连接表中, itemid 的编码不同,一个是 utf8 ,一个是 utf8mb4 !

打开表,把两个表中itemid这一列的编码都改成utf8。再次运行解释。

bc37e664b0ec502b818b9cd2e1fdb90e.png

从解释结果来看已经没有问题了。

再看下结果2中的语句:

1 /*select#1*/

2 SELECT

3 '0000eb612d78407a91a9b3854fffffff' AS`itemid`,4 'db87a780427d4d02ba2bd49fac8cf98b' AS`token`,5 '2016-12-16 10:46:53' AS`create_time`,6 '' AS`ftoken`,7 'cxx' AS`product_type`8 FROM

9 `toy_item_plat`.`p_item_token`10 JOIN`toy_item_plat`.`p_item`11 WHERE

12 1

这 select 中全是常量了。速度能不快吗?

执行结果0.036s。符合预期

经验总结:

explain 可以查看执行计划是否符合预期,如果有出现rows较大的情况,则说明出现了全表扫描,将来会是性能瓶颈

show warning的结果,则能看到优化器处理后的语句。如果与原始语句有出入,仔细对比研究能够发现实际问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql sql优化方法_一个MySql Sql 优化技巧分享 的相关文章

  • 图像恢复(加噪与去噪)

    人工智能导论实验导航 实验一 斑马问题 https blog csdn net weixin 46291251 article details 122246347 实验二 图像恢复 https blog csdn net weixin 46
  • tar命令笔记

    作用 tar 可以保存文件属性 本身不具备压缩能力 配合gzip或者bzip 进行压缩解压缩 参数 相关参数如下 来自百度百科 c create 创建新的tar文件 x extract get 解开tar文件 t list 列出tar文件中
  • 火狐浏览器文本两端对齐无效text-align: justify

    找了很多地方 尝试很多办法都不好使 直到看到这篇 只需要设置了text align justify时加设一个white space pre line就可以了
  • [Docker]使用Docker部署Kafka

    Kafka 是一个分布式流处理平台 它依赖于 ZooKeeper 作为其协调服务 在 Kafka 集群中 ZooKeeper 负责管理和协调 Kafka 的各个节点 因此 要在 Docker 容器中启动 Kafka 通常需要同时启动一个 Z
  • 对数器的简单使用

    对数器 1 前言 2 内容 简介对数器 以排序算法的检测为实例 3 总结 4 更新日志 1 前言 学习左神的数据结构的过程中 推荐使用对数器检验自己的算法是否正确 2 内容 简介对数器 1 对数器的作用 在一个题目未OJ的时候 可以通过对数
  • Transformer学习笔记

    一 Transformer诞生背景 Transformer模型是解决序列转录问题的一大创新 在Transformer模型之前 序列转录模型都或多或少的基于复杂的循环或卷积神经网络 循环神经网络的计算是时序性的 位置的计算必须基于之前所有位置
  • 微信小程序数据 \n 换行符失效解决办法

    最近遇到一个问题 使用uni app写小程序时 拿到一个字符串 后台返回的 需要在 n 处换行 但是直接使用 let title 黄鹤楼送 n孟浩然之广陵
  • 使用python对银行信息管理系统的简单实现

    一 首先是用户属性的类 class account object 储存用户信息的类 def init self id1 name tel money self id id1 账户 self name name 姓名 self tel tel
  • mo管理器java_Android开发之通过包管理器获取安装应用信息

    最近在自己写一个APP 有一个模块需要获取手机应用的一些信息 坑还是有 但都基本踩过了 自己把他实现了出来 实现方法还是很需要掌握的 底部弹出的对话框中四个选项的实现不多做说明 主要讲讲如何获取这些安装的应用信息 好了 不多说 看看效果图
  • 1024,干程序才懂得节日!

    1024程序员节 1024程序员节是广大程序员的共同节日 1024是2的十次方 二进制计数的基本计量单位之一 针对程序员经常周末加班与工作日熬夜的情况 部分互联网机构倡议每年的10月24日为1024程序员节 在这一天建议程序员拒绝加班 程序
  • 【C/C++】报错问题积累

    1 出现Deprecated declaration XXX give arg types c文件中 有没有参数的函数时 声明需要加void即 main c void fun main h void fun void
  • androidX 在AndroidMainfest里面加入provider后编译不通过

  • 【three.js练习程序】创建简单物理地形

  • ubuntu 18.04 双系统安装

    下载镜像 Ubuntu 18 04 6 LTS Bionic Beaver 磁盘分区用于ubuntu存储 在C盘中分出200M用于ubuntu的引导启动 C盘已经分出200M空间 D盘分配出160G用于存储文件 U盘制作系统盘 刻录软件 推
  • linux下TUN或TAP虚拟网卡的使用

    tun tap 驱动程序实现了虚拟网卡的功能 tun表示虚拟的是点对点设备 tap表示虚拟的是以太网设备 这两种设备针对网络包实施不同的封装 利用tun tap 驱动 可以将tcp ip协议栈处理好的网络分包传给任何一个使用tun tap驱
  • ClickHouse安装(集群版)

    ClickHouse安装 集群版 一 准备工作 1 设置hostname 2 hosts映射 3 关闭防火墙 4 同步时间 5 关闭selinux 6 安装好zookeeper 7 重启 二 搭建ClickHouse集群 1 下载安装包 2
  • c++类模板与继承详解

    c 类模板 继承 详解 类模板和类模板之间 类模板和类之间可以互相继承 它们之间的派生关系有以下四种情况 1 类模板继承类模板 2 类模板继承模板类 3 类模板继承普通类 4 普通类继承模板类 include
  • 【linux】shell 编程之字符串与数组

    前言 对字符串的操作在众多的编程语言中可以说是最基础的了 字符串 String 就是一系列字符的组合 字符串是 Shell 编程中最常用的数据类型之一 除了数字和字符串 也没有其他类型了 一 shell 中字符串的几种格式 在shell中
  • 吃透Chisel语言.18.Chisel模块详解(五)——Chisel中使用Verilog模块

    Chisel模块详解 五 Chisel中使用Verilog模块 上一篇文章讲述了用函数实现轻量级模块的方法 可以大幅度提升编码效率 Chisel中也提供了一些好用的函数 方便我们编写代码 也方便Chisel编译器优化生成的硬件电路 在Chi

随机推荐

  • Blender 之修改器代码分析

    转载 Blender 之修改器代码分析 KAlO2 博客园 Blender 之修改器代码分析 Blender的修改器 modifier 模块 默认界面右下块 Property 面板的扳手 分类 修改 生成 形变 模拟 列出所有的修改器 也可
  • 使用七牛云Python SDK来实现自动下载所有文件

    安装七牛云Python SDK 在终端中输入以下命令 pip install qiniu 连接七牛云存储 创建下载链接并下载文件 示例代码如下 import os from qiniu import Auth BucketManager 配
  • iOS和macOS上Swift编写的EOS区块链开源框架SwiftyEOS

    SwiftyEOS是一个用于与EOS交互的开源框架 用Swift编写 可以在iOS和macOS上使用 特点 EOS密钥对生成 私钥导入 签名哈希 基本的RPC API 链 历史 可查询客户端 交易 EOS token 转账 帮助类处理iOS
  • C/C++语言实现WiFi(socket)数据收发(客户端和服务端)

    目录 客户端 client 服务端 server C C 实现TCP通信 接收WIFI数据 编程环境 VC 6 0 手机端 使用WiFi调试助手 提示 整个过程在局域网中进行 很多编程语言都可以实现socket通信 本博客将通过C C 实现
  • Unity小游戏-勇闯小岛(PC) 项目展示+完整项目源码

    游戏录像 游戏玩法 主角可以变换四种状态 玩家通过四种状态特有的技能来击败眼前的怪物闯关 切换到棕色 有一个一直围绕自己旋转的大摆斧攻击敌人 切换到绿色 可以抵挡一切的投掷物 但是无法攻击敌人 切换到粉色 切换瞬间可以发出飞镖 切换到蓝色
  • gradle 笔记

    1 各种options Simon ZOUYUN PC f AndroidstudioProjects KeyguardTest master gradle help USAGE gradle option task h help Show
  • Linux 进程系统

    Linux 进程系统 守护进程的产生 process namespace namespace 是 Linux 内核用来隔离内核资源的方式 通过 namespace 可以让一些进程只能看到与自己相关的一部分资源 而另外一些进程也只能看到与它们
  • JAVA发展历程

    Java是一门面向对象的编程语言 不仅吸收了C 语言的各种优点 还摒弃了C 里难以理解的多继承 指针等概念 因此Java语言具有功能强大和简单易用两个特征 Java语言作为静态面向对象编程语言的代表 极好地实现了面向对象理论 允许程序员以优
  • c语言之数据结构学习心得

    写在前面 你们好 我是小庄 很高兴能和你们一起学习c语言 如果您对编程感兴趣的话可关注我的动态 写博文是一种习惯 在这过程中能够梳理知识和巩固知识点 一 绪论 1 什么是数据 数据元素 数据项 数据对象 数据结构 1 数据 客观事物的符号表
  • 在eclipse里建立包中包

    工具 原料 工具软件 j2EE eclipse 语言 Java 方法 步骤 1 在src文件夹右击 new package 见下图 2 点击finish 3 在com包右击new package 4
  • 工控上位机程序为什么只能用C语言?

    工控上位机程序并不只能用C 开发 实际上在工业自动化领域中 常见的上位机开发语言包括但不限于以下几种 C C 是一种常用的编程语言 在工控领域中被广泛使用 它具有良好的面向对象特性和丰富的类库支持 可以实现高性能的上位机程序开发 C C C
  • Allegro使用经验笔记

    一 安装 SPB15 2 CD1 3 安装1 2 第3为库 不安装 License安装 设置环境变量Lm license file D Cadencelicense Dat 修改License中SERVER Yyh ANY 5280为SER
  • Typora快捷键大全

    1 字体编辑 1 1 大小 大小 ctr 数字 或 ctr 加减号 或 1 2 加粗 加粗 ctr b 1 3 倾斜 倾斜 ctr i 1 4 下划线 下划线 ctr u 1 5 删除线 删除线 alt shift 5 1 6 上标 上标
  • YOLOv8改进开源

    大致介绍一下AI全栈技术社区的相关内容 主要涵盖了YOLO全系列模型的改进 量化 蒸馏 剪枝以及不同工具链的使用 同时也涵盖多目标跟踪 语义分割 3D目标检测 AI模型部署等内容 具体内容小伙伴们可以参考下面的目录部分 所有内容均有答疑服务
  • 学习-Python字符串之格式化

    第1关 学习 Python字符串之格式化 任务描述 本关任务 给定一个列表 计算列表内所有数据标准差 结果保留小数点后 2 位 相关知识 为了完成本关任务 你需要掌握 的使用 format 的使用 Template 的使用 在之前的实训中
  • 数据分析01——Anaconda安装/Anaconda中的pip换源/jupyter配置

    0 前言 数据分析三大模块知识 numpy 数组计算 pandas 基于numpy开发 用于数据清洗和数据分析 matplotlib 实现数据可视化 1 Anaconda安装 安装Anaconda 注意安装路径不一定是c盘 但是安装目录不要
  • Python Excel操作模块XlsxWriter之写入worksheet.write()

    worksheet write wirte row col args 向工作表单元格写入普通的数据 参数 row 单元格所在的行 索引从0开始计数 col 单元格所在的列 索引从0开始计数 args 传递到子方法的附加参数诸如数字 字符串
  • 端口介绍

    文章来源 https m toutiaocdn com group 6680437870504706572 app news article timestamp 1563010542 req id 201907131735410100230
  • Linux lvm管理讲解及命令

    作者 小刘在C站 个人主页 小刘主页 每天分享云计算网络运维课堂笔记 努力不一定有回报 但一定会有收获加油 一起努力 共赴美好人生 夕阳下 是最美的绽放 树高千尺 落叶归根人生不易 人间真情 前言 目录 一 lvm管理 1 Logical
  • mysql sql优化方法_一个MySql Sql 优化技巧分享

    有天发现一个带inner join的sql 执行速度虽然不是很慢 0 1 0 2 但是没有达到理想速度 两个表关联 且关联的字段都是主键 查询的字段是唯一索引 sql如下 SELECTp item token p item product