你写的每条SQL都是全表扫描吗

你写的每条SQL都是全表扫描吗?如果是,那MySQL可太感谢你了,每一次SQL执行都是在给MySQL上压力、上对抗。MySQL有苦难言:你不知道索引吗?你写的SQL索引都失效了不知道吗?慢查询不懂啊?建那么多索引干嘛呢。。。

在这里插入图片描述

文章目录

    • 1. 慢查询
    • 2. SQL优化
      • 2.1 表设计优化
      • 2.2 SQL语句优化
      • 2.3 索引如何设计
    • 未完待续。。。

1. 慢查询

面试官:知道MySQL慢查询吗?

MySQL的慢查询日志可以记录执行时间超过阈值的SQL查询语句,所以我们可以利用该日志查找出哪些SQL语句执行效率差,从而对SQL语句进行优化。

MySQL5.7以上版本可以通过SET命令来开启慢查询日志。

     SET GLOBAL slow_query_log=ON;SET GLOBAL long_query_time=2;SET SESSION long_query_time=2;

开启完慢查询日志,我们找到该日志的位置,打开文件即可查询慢查询的SQL。

     # 查询慢查询日志文件位置SHOW VARIABLES LIKE '%slow_query_log_file%';

在这里插入图片描述

打开DESKTOP-ALU4BOC-slow.log文件,找到慢查询SQL为:select sleep(11)

D:\MySQL\bin\mysqld, Version: 5.5.40 (MySQL Community Server (GPL)). started with:
TCP Port: 3306, Named Pipe: MySQL
Time                 Id Command    Argument
# Time: 220828 21:40:28
# User@Host: root[root] @ localhost [127.0.0.1]
# Query_time: 11.004454  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0
use mysql;
SET timestamp=1661694028;
select sleep(11);

2. SQL优化

2.1 表设计优化

面试官:在工作中你怎么优化SQL的?

业务开发中涉及数据库的第一步是表设计,要优化SQL就要从第一步开始做起。

MySQL表设计要尽可能满足数据库三大范式,帮助大家回顾下:

  1. 第一范式:数据库表中的每一列都是不可再分的属性,属性相近或相同的列应该合并

  2. 第二范式:满足第一范式的条件下,一个表只能描述一个对象。如果某些列经常出现数据重复,应该把这些列作为另一个表

  3. 第三范式:满足第二范式的条件下,表中的每一列都只能依赖于主键,即直接与主键相关。

我们在业务开发中遇到反第二范式的情况是最多的,例如以下订单明细表的设计,每一个订单明细都包含了重复的商品名称、商品单位、商品价格,这三个字段属于字段冗余存储。如果表的数据量级很大,那造成的冗余存储量是可想而知的,而且最要命的问题是如果要修改某一个商品名称,那所有的订单明细数据都要修改

在这里插入图片描述

我们可以遵循第三范式,把冗余的字段抽出一个新的商品表,当要查询订单明细时只需要把两表通过商品id进行连接即可。

在这里插入图片描述

在这里插入图片描述

面试官:遵循第二范式就一定最优?

遵循第二范式的表设计不一定是最优的情况,还是那句话,要根据实际的业务场景权衡利弊。

虽然把冗余数据抽离出去了,但却增加了表的数量,也意味着查询数据时表之间的join连接操作也会变多。而join连接的性能是比较低的,有可能join操作会成为数据库性能的瓶颈。

2.2 SQL语句优化

面试官:还有呢?

SQL优化除了做好表设计的优化工作,还需要对SQL语句进行优化。而SQL查询语句的优化主要从覆盖索引避免索引失效减少不必要的查询三个方面入手。

一、从覆盖索引的角度。

order by排序的字段要尽量覆盖索引。如果使用非索引字段进行排序,MySQL会进行额外的文件排序,将查询结果根据非索引列在磁盘中再排序一次。当我们使用explain关键字分析SQL时会发现Extra会出现Using filesort

group by分组要尽量覆盖索引。如果使用非索引字段进行分组,MySQL只能进行全表扫描后建立临时表才能得出分组结果。

另外我们可以使用explain关键字来分析SQL语句的效率,查看SQL语句是否覆盖索引。

二、从避免索引失效的角度。

关于如何避免索引失效,大家可以阅读我出版的《JavaGetOffer》专栏关于【MySQL索引】的文章。

三、从减少不必要的查询的角度。

如果只需要查询部分列,尽量不要使用select *查询,防止造成不必要的资源消耗、占用过多的网络带宽。

2.3 索引如何设计

面试官:在工作中,表索引你怎么设计的?

索引的设计有以下设计原则,大家在实际业务开发中应该尽量遵循这些原则,可以帮你避开不少坑。

  1. 经常进行order by排序、group by分组、join多表联结查询的字段应该建立索引。

  2. 经常在where子句中出现的字段应该建立索引。

  3. 尽量使用数据量小的字段建立索引。例如对于char(500)和char(10)两个字段类型来说,肯定是以后者进行索引匹配的速度更快。

  4. 如果需要建立索引的字段值比较长,可以使用值的部分前缀来建立索引。

    例如varchar类型的name字段,我们需要根据前三个字符来建立前缀索引,可以使用以下SQL命令:ALTER TABLE example_table ADD INDEX index_name (name(3))

面试官:那索引建立越多,查询效率就越高吗?

另外大家记住一点,索引不是建立越多越好。合理设计的索引确实能大大提高SQL效率,但每建立一个字段索引,MySQL就要为该索引多维护一棵B-Tree,越多的索引会造成表更新效率变得低下。

🌱以【面试官面试】形式覆盖Java程序员所需掌握的Java核心知识、面试重点,本博客收录在我开源的《Java学习指南》中,会一直完善下去,希望收到大家的 ⭐ Star ⭐支持,这是我创作的最大动力: https://github.com/hdgaadd/JavaGetOffer

未完待续。。。

创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/9608.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

进一步解读英伟达 Blackwell 架构、NVlink及GB200 超级芯片

2024年3月19日,英伟达CEO黄仁勋在GTC大会上公布了新一代AI芯片架构BLACKWELL,并推出基于该架构的超级芯片GB200,将助推数据处理、工程模拟、电子设计自动化、计算机辅助药物设计、量子计算和生成式 AI 等领域。 为了纪念杰出的数学家David H…

设计软件有哪些?渲染软件篇(3),渲染100邀请码1a12

今天我们继续介绍几款渲染软件,方便大家了解 1、渲染100(http://www.xuanran100.com/?ycode1a12) 渲染100是网渲平台,为设计师提供高性能的渲染服务。通过它设计师可以把本地渲染移到云端进行,速度快价格便宜,支持3dmax、vray、…

文献速递:深度学习医学影像心脏疾病检测与诊断--基于迁移学习的生成对抗网络用于静态和动态心脏PET的衰减校正

Title 题目 Transfer learning‑based attenuation correction for static and dynamic cardiac PET using a generative adversarial network 基于迁移学习的生成对抗网络用于静态和动态心脏PET的衰减校正 01 文献速递介绍 心脏正电子发射断层扫描(PET&#xf…

2024数维杯C题成品文章代码思路分享保姆级

天然气水合物资源评估与钻井位置优化:方法、挑战 摘要 天然气水合物,通常称为可燃冰,是一种在特定高压低温条件下由天然气和水形成的类冰结晶物。由于其外观类似冰块且可燃,天然气水合物在深海底及永久冻土区广泛分布,…

数据结构05:树与二叉树 习题01[C++]

考研笔记整理,本篇作为树与二叉树的基本概念习题,供小伙伴们参考~🥝🥝 之前的博文链接在此:数据结构05:树与二叉树[C]-CSDN博客~🥝🥝 第1版:王道书的课后习题~&#x1…

React + 项目(从基础到实战) -- 第11期

目标 问卷编辑器的开发 设计UI - 拆分布局 水平垂直居中 画布 y方向滚动 自定义问卷组件 后端 返回组件数据 //获取单个问卷信息{url: /api/question/:id,method: get,response: () > {return {errno: 0,data: {id: Random.id(),title: Random.ctitle(),componentList:[//…

蒸汽工厂的新翼:数字孪生锅炉引领未来

在飞速发展的工业4.0时代,数字孪生技术已经深入到我们生产生活的方方面面。而对于那些承载着重工业血脉的蒸汽工厂来说,一项新的技术正在悄然改变它们的未来。 走进蒸汽工厂,感受传统与现代的交融 蒸汽工厂,这个充满力量与热情的…

马化腾用了一年多的时间,告诉所有人,视频号小店是新风口!

大家好,我是电商笨笨熊 当腾讯说出自己要做电商的时候,所有人都在说,根本不可能; 甚至在视频号小店正式推出之后,依旧有人说,腾讯做电商就是笑话; 一个“抄”过来的项目,毫无特色…

Kubernetes容器技术详解

kubernetes Kubernetes(K8s)由Google打造,是一款功能强大、灵活可扩展的容器编排平台,引领云原生技术潮流。 Kubernetes主要解决以下4大点: 1.自动化运维平台 如下图所示: Kubernetes携手Docker&#xf…

探秘未来科技:数字化无人巡检的奇妙之旅

嘿,朋友们!下午茶时间到!趁着这会儿咱们来聊一个超级炫酷的话题——数字化无人巡检。想象一下,那些曾经需要人工跋山涉水、风吹日晒的巡检工作,现在正被一群“智能小分队”悄悄接手,是不是觉得既神奇又方便…

25岁软件工程师:19岁创业,25岁创建自己的工作室,谈一下我对创业的一点思考。

文章目录 🥝About Me🏀关于工作室✅我对创业思考 大家好哈,欢迎查看工程师令狐本期节目。这篇文章主要是一篇回忆复盘总结文,复盘总结刚上大学到走向工作这段经历,自己的感悟、感想与收获,期望对读者有所帮…

安防监控/视频汇聚系统EasyCVR+AI智能分析助力解决校园霸凌事件

一、方案背景 校园霸凌这一校园中不应存在的现象,却屡见不鲜,它像一把锋利的刀,深深地刺入那些无辜的心灵,让受害者承受着无尽的痛苦。随着科技的进步与发展,我们应该追求有效、进步的手段来阻止校园霸凌事件的发生&a…

解决 Git拉取代码和本地代码丢失问题

git拉取代码,本地写的代码全部为空了,当时都蒙了,最后解决办法是找到对应文件的历史记录 举例:以本地的demo举例,不管是否有git或svn控制,都可以找到历史记录 解决办法: 1、对代码丢失的文件 …

【算法】Dijkstra求最短路算法

TOP提示:Dijkstra算法只适用于不含负权边的情况 Dijkstra算法是一个基于贪心,广搜和动态规划 求图中某点到其他所有点的最短路径的算法 一、步骤 首先我们先总结Dijkstra算法的完整步骤 我们需要一个dis数组存储从起点到达其他节点的最短距离&…

CSS学习笔记之中级教程(一)

1、CSS 布局 - display 属性 1.1 display 属性 display 属性是用于控制布局的最重要的 CSS 属性。 display 属性规定是否/如何显示元素。 每个 HTML 元素都有一个默认的 display 值,具体取决于它的元素类型。大多数元素的默认 display 值为 block 或 inline。 …

每日OJ题_记忆化搜索②_力扣62. 不同路径(三种解法)

目录 力扣62. 不同路径 解析代码1_暴搜递归(超时) 解析代码2_记忆化搜索 解析代码3_动态规划 力扣62. 不同路径 62. 不同路径 难度 中等 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器…

【MySQL数据库】详解数据库审核工具SQLE的部署及接口调用

SQLE部署及使用 1. 部署SQLE SQLE相信大家都不陌生吧,它是一款开源,支持多场景审核,支持标准化上线流程,原生支持 MySQL 审核且数据库类型可扩展的 SQL审核工具。我们可以基于此工具进行数据库SQL审核,提升SQL脚本质量…

视频怎么打水印?6个软件教你快速进行视频水印制作

视频怎么打水印?6个软件教你快速进行视频水印制作 添加水印是保护视频版权、提升视频专业性的重要手段之一。以下是六款软件,它们能够帮助你快速进行视频水印制作,让你的视频更具个性和专业性: 1.迅捷视频剪辑软件:…

5月白银现货最新行情走势

美联储5月的议息会议举行在即,但从联邦公开市场委员会(FOMC)近期透露的信息来看,降息似乎并没有迫切性。——美联储理事鲍曼认为通胀存在"上行风险",明尼阿波利斯联邦储备银行行长卡什卡利提出了今年不降息的…

图片过大怎么处理变小?在线编辑图片工具推荐

在各种平台进行图片上传时,经常会遇到由于图片过大而无法成功上传的问题,为了顺利进行下一步操作,我们需要将图片进行缩小处理,通常情况下,我们可以使用各种软件工具来对图片进行缩小,如何快速有效地调整图…