你写的每条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.hqwc.cn/news/685417.html

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

相关文章

Dependencies:查找项目中dll关联文件是否缺失。

前言 Dependencies工具作为一款优秀的DLL解析工具,能让你很直观地看到DLL的相关信息,如具备哪些功能函数、参数,又比如该DLL基于哪些DLL运行。判断该dll基于哪些dll运行,如果基于的dll丢失,那么就会提示。就能判断缺少…

Docker笔记(七)使用Docker部署Spring Boot项目

本文介绍如何使用Docker打包并部署Spring Boot多模块项目。 其中本文涉及的Docker的私库是用Nexus3搭建的。 使用Docker部署Spring Boot项目有三种方式 (1)使用 spring-boot-maven-plugin内置的build-image. (2)使用 Google 的 j…

手把手系列!使用 Zilliz Cloud 和 AWS Bedrock 搭建 RAG 应用

检索增强生成(Retrieval Augemented Generation, RAG)是一种 AI 框架,它通过结合信息检索和自然语言处理(NLP)能力从而增强文本生成。具体而言,RAG 系统中的语言模型通过一种检索机制查询和搜索知识库或外部…

rocketmq控制台部署

网络找rocketmq控制台有源码包,还需要编译太麻烦,找到了 rocketmq-dashboard-1.0.1-SNAPSHOT.jar已经编译后的jar,只有简单修改服务器端口和监控rocketmq集群地址和端口就可以。需要jar资源的可以咨询本人。 步骤1:根据需要配置ro…

LinkedList链表

LinkedList 的全面说明 LinkList底层实现了双向链表和双端队列特点可以添加任意元素(元素可以重复),包括null线程不安全,没有实现同步 LinkedList 的底层操作机制 LinkedList底层维护了一个双向链表LinkList中维护了两个属性fi…

VBA_NZ系列工具NZ06:VBA创建PDF文件说明

我的教程一共九套及VBA汉英手册一部,分为初级、中级、高级三大部分。是对VBA的系统讲解,从简单的入门,到数据库,到字典,到高级的网抓及类的应用。大家在学习的过程中可能会存在困惑,这么多知识点该如何组织…

CoT个人记录

1.Few-shot COT(CoT, 思维链) 通过向大语言模型展示一些少量的例子(Few-shot ),在样例中解释推理过程,大语言模型在回答时也会模拟人类思考推理的过程生成中间的推理步骤,,再得到答案。这种推理的解释往往会引导出更准…

1725 ssm资产管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java ssm资产管理系统是一套完善的web设计系统(系统采用SSM框架进行设计开发,springspringMVCmybatis),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/…

拼团商城系统搭建如何做?

团购商城就是团体到商城进行购物的一种交易方式,其场景应用包括装修建材、家居用品、汽车、房屋、家电、电脑、生活用品等各个领域。作为消费者,也能从中享受5%到40%不等的商品优惠幅度。那么,拼团商城系统搭建如何做?我们从优势、…

最长递增子序列 详解 CPP

目录 前言思路梳理题解最优思路 我的思路思路一 考虑连续 对一半 思路二 基于思路一的优化 思路三 基于思路二的优化 √ 通过了但是效率太低 我的代码 前言 今天继续做动态dp的第三题,最大子序和,昨天做最大连续子数组的和已经有一些写状态转移方程的经…

2010年认证杯SPSSPRO杯数学建模D题(第一阶段)服务网点的分布全过程文档及程序

2010年认证杯SPSSPRO杯数学建模 D题 服务网点的分布 原题再现: 服务网点、通讯基站的设置,都存在如何设置较少的站点,获得较大效益的问题。通讯基站的覆盖范围一般是圆形的,而消防、快餐、快递服务则受到道路情况和到达时间的限…

这份走心的母亲节礼物清单,请查收!

老舍在《我的母亲》中写道:“人,活到八九十岁,有母亲在,便可以多少还有点孩子气。失了慈母便像花插在瓶子里,虽然还有色有香,却失去了根。有母亲的人,心里是安定的。”母亲,对我们每…