2024年java面试--mysql(3)

2023-11-12

系列文章目录

  1. 2024年java面试(一)–spring篇
  2. 2024年java面试(二)–spring篇
  3. 2024年java面试(三)–spring篇
  4. 2024年java面试(四)–spring篇
  5. 2024年java面试–集合篇
  6. 2024年java面试–redis(1)
  7. 2024年java面试–redis(2)


mysql优化

1.索引优化

索引是加速数据库查询的关键。在设计表结构时,应该根据查询的需求添加合适的索引。常用的索引包括主键、唯一索引、普通索引、联合索引、前缀索引(vachar、text这种长的数据并且只需要前几个区分度就很高)等。

同时,要避免过多的索引,因为每个索引都需要占用存储空间,会影响写入性能。

2.查询优化

优化查询语句是提高MySQL性能的重要手段。要尽可能使用索引,避免全表扫描。同时,要避免使用子查询,尽可能使用连接查询;避免在查询中使用“%”通配符;避免多余的字段等等。

3.数据库表结构优化

合理的表结构可以提高查询效率和减少存储空间。应该避免使用大字段,如TEXT、BLOB等,因为这些字段会占用大量的存储空间。同时,应该避免冗余字段,避免更新和维护时的复杂性。

①单库不超过200张表

②单表不超过500w数据

③单表不超过40列

④单表索引不超过5个

4.缓存优化

使用缓存可以大大减轻MySQL数据库的压力,提高查询效率。常用的缓存技术包括Memcached和Redis等。

5.分区优化

对于数据量较大的表,可以使用分区技术将表分成多个部分。这样可以提高查询效率,同时降低了单个表的存储空间和索引大小。

6.配置优化

MySQL的参数配置会影响MySQL的性能。需要根据实际情况进行调整,包括缓冲区、连接数、线程数、查询缓存等等。

7.硬件优化

硬件设备也会影响MySQL的性能。要选择更快速的硬件设备,如更快的磁盘、更快的CPU和更多的内存等等。同时,要根据实际情况来决定使用RAID、SSD等技术。

DQL语法

在这里插入图片描述

逻辑存储结构

在这里插入图片描述

1. 插入数据

#客户端连接服务端时,加上参数--local-infile
​
mysql --local-infile -u root-p
​
#设置全局参数local_infile为1,开启从本地加载文件导入数据的开关
​
set global local_infile = 1;
​
#执行load指令将准备好的数据,加载到表结构中
​
load data local infile '/root/sql1.loginto table tb_user fields terminated by ',' lines terminated by '\n';
​
主键顺序插入性能高于乱序插入

2. 主键优化

满足业务需求的情况下,尽量降低主键的长度。

插入数据时,尽量选择顺序插入,选择使用AUTO_INCREMENT自增主键。

尽量不要使用UUID做主键或者是其他自然主键,如身份证号。

业务操作时,避免对主键的修改。

3. order by优化

  1. Using filesort 通过表的索引或全表扫描,读取满足条件的数据行,然后在排序缓冲区sort buffer中完成排序操作,所有不是通过索引直接返回排序结果的排序都叫FileSot排序。
  2. Using index :通过有序索引顺序扫描直接返回有序数据,这种情况即为using index,不需要额外排序,操作效率高。
#没有创建索引时,根据age, phone进行排序
explain select id,age,phone from tb_user order by age , phone;
#创建索引
create index idx_user_age_phone_aa on tb_user(age,phone);
#创建索引后,根据age, phone进行升序排序
explain select id,age,phone from tb_user order by age , phone;
#创建索引后,根据age, phone进行降序排序
explain select id,age,phone from tb_user order by age desc , phone desc ;
#根据age, phone进行降序一个升序,一个降序
explain select id,age,phone from tb_user order by age asc , phone desc;
#创建索引
create index idx_user_age _phone_ad on tb_user(age asc ,phone desc);
#根据age, phone进行降序一个升序,一个降序
explain select id,age,phone from tb_user order by age asc , phone desc;

根据排序字段建立合适的索引,多字段排序时,也遵循最左前缀法则。

尽量使用覆盖索引(查询的字段在联合索引中可以直接查询到不需要进行回表查询)。

多字段排序,一个升序一个降序,此时需要注意联合索引在创建时的规则(ASC/DESC)。

如果不可避免的出现filesort,大数据量排序时,可以适当增大排序缓冲区大小 sort_buffer_size(默认256k)。

4. group by优化

在分组操作时,可以通过索引来提高效率。

分组操作时,索引的使用也是满足最左前缀法则的。

#执行分组操作,根据profession字段分组
explain select profession , count(*) from tb_user group by profession;
#创建索引
Create index idx_user_pro_age_sta on tb_user(profession , age , status);
#执行分组操作,根据profession字段分组
explain select profession , count(*) from tb_user group by profession;
#执行分组操作,根据profession字段分组
explain select profession , count(*) from tb_user group by profession,age;

5. limit 优化

一个常见又非常头疼的问题就是limit 2000000,10,此时需要MySQL排序前2000010记录,仅仅返回2000000-2000010的记录,其他记录丢弃,查询排序的代价非常大。

优化思路:一般分页查询时,通过创建覆盖索引能够比较好地提高性能,可以通过覆盖索引加子查询形式进行优化。

explain select * from tb_sku t , (select id from tb_sku order by id limit 2000000,10) a where t.id = aid;

6. count 优化

count的几种用法

count(主键) : InnoDB引擎会遍历整张表,把每一行的主键id值都取出来,返回给服务层。服务层拿到主键后,直接按行进行累加(主键不可能为null)。

count(字段) : 没有not null约束: InnoDB引擎会遍历整张表把每一行的字段值都取出来,返回给服务层,服务层判断是否为null,不为null,计数累加。

有not null约束: InnoDB引擎会遍历整张表把每一行的字段值都取出来,返回给服务层,直接按行进行累加。

count (1) : InnoDB引擎遍历整张表,但不取值。服务层对于返回的每一行,放一个数字“1”进去,直接按行进行累加。

count (*) : InnoDB引擎并不会把全部字段取出来,而是专门做了优化,不取值,服务层直接按行进行累

按照效率排序的话,count(字段)此count(主键id)< count(1)≈count(*),所以尽量使用count()

MyISAM引擎把一个表的总行数存在了磁盘上,因此执行count(*)的时候会直接返回这个数,效率很高;

InnoDB引擎就麻烦了,它执行count(*)的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。

7. update优化

InnoDB的行锁是针对索引加的锁,不是针对记录加的锁,并且该索引不能失效,否则会从行锁升级为表锁。

如果update过程中where条件是没有索引的将会从行锁升级为表锁。

如果where条件是有索引的就会是正常的行锁。

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

2024年java面试--mysql(3) 的相关文章

  • 使用 Ant 将非代码资源添加到 jar 文件

    我正在将 java 应用程序打包成 jar 文件 我正在使用 ant 和 eclipse 我实际上需要在 jar 中直接在根文件夹下包含几个单独的非代码文件 xml 和 txt 文件 而不是与代码位于同一位置 我正在尝试使用includes
  • 如何在 Antlr4 中为零参数函数编写语法

    我的函数具有参数语法 如下面的词法分析器和解析器 MyFunctionsLexer g4 lexer grammar MyFunctionsLexer FUNCTION FUNCTION NAME A Za z0 9 DOT COMMA L
  • MySQL:如何获取每个分组的x个结果数[重复]

    这个问题在这里已经有答案了 可能的重复 mysql 在 GROUP BY 中使用 LIMIT 来获取每组 N 个结果 https stackoverflow com questions 2129693 mysql using limit w
  • 是否可以使用 Flying Saucer (XHTML-Renderer) 将 css 解析为类路径资源?

    我正在尝试将资源打包到 jar 中 但我无法让 Flying Saucer 在类路径上找到 css 我无法轻松构建 URL 来无缝解决此问题 https stackoverflow com questions 861500 url to l
  • 如何将 Mat (opencv) 转换为 INDArray (DL4J)?

    我希望任何人都可以帮助我解决这个任务 我正在处理一些图像分类并尝试将 OpenCv 3 2 0 和 DL4J 结合起来 我知道DL4J也包含Opencv 但我认为它没什么用 谁能帮我 如何转换成 INDArray 我尝试阅读一些问题here
  • Spring Security SAML2 使用 G Suite 作为 Idp

    我正在尝试使用 Spring Security 5 3 3 RELEASE 来处理 Spring Boot 应用程序中的 SAML2 身份验证 Spring Boot 应用程序将成为 SP G Suite 将成为 IDP 在我的 Maven
  • 需要使用 joda 进行灵活的日期时间转换

    我想使用 joda 解析电子邮件中的日期时间字符串 不幸的是我得到了各种不同的格式 例如 Wed 19 Jan 2011 12 52 31 0600 Wed 19 Jan 2011 10 15 34 0800 PST Wed 19 Jan
  • 自动生成Flyway的迁移SQL

    当通过 Java 代码添加新模型 字段等时 JPA Hibernate 的自动模式生成是否可以生成新的 Flyway 迁移 捕获自动生成的 SQL 并将其直接保存到新的 Flyway 迁移中 以供审查 编辑 提交到项目存储库 这将很有用 预
  • 如何在 HTML / Javascript 页面中插入 PHP 下拉列表

    好吧 这是我的第二篇文章 请接受我是一个完全的新手 愿意学习 花了很多时间在各个网站上寻找答案 而且我几乎已经到达了我需要到达的地方 至少在这一点上 我有一个网页 其中有许多 javascript 函数 这些函数一起使用 google 地图
  • 是否可以通过编程方式查找 logback 日志文件?

    自动附加日志文件以支持电子邮件会很有用 我可以以编程方式设置路径 如以编程方式设置 Logback Appender 路径 https stackoverflow com questions 3803184 setting logback
  • 如何使用 Hibernate (EntityManager) 或 JPA 调用 Oracle 函数或过程

    我有一个返回 sys refcursor 的 Oracle 函数 当我使用 Hibernate 调用该函数时 出现以下异常 Hibernate call my function org hibernate exception Generic
  • 自动删除主键序列中的间隙

    我正在创建一个网页 该网页根据用户操作将数据存储到 MySQL 数据库中 数据库有很多行 行的主键是列 rowID 它只是按顺序对行进行编号 例如 1 2 3 4 用户可以选择删除行 问题是当用户删除最后一行以外的行时 rowID 中有一个
  • 套接字的读写如何同步?

    我们创建一个套接字 在套接字的一侧有一个 服务器 在另一侧有一个 客户端 服务器和客户端都可以向套接字写入和读取 这是我的理解 我不明白以下事情 如果服务器从套接字读取数据 它在套接字中是否只看到客户端写入套接字的内容 我的意思是 如果服务
  • 如何在 Spring 属性中进行算术运算?

  • 计算 mysql 数据库行数的最佳方法

    在遇到 mysql 查询加载时间慢的问题后 我现在正在寻找计算行数的最佳方法 我曾经愚蠢地使用过mysql num rows 函数来做到这一点 现在意识到这是最糟糕的方法 我实际上正在制作一个分页来用 PHP 制作页面 我找到了几种计算行数
  • 读取电子邮件的文本文件转换为 Javamail MimeMessage

    我有一个电子邮件原始来源的文本文件 直接从 gmail 复制 如果您单击 查看原始文件 您就会看到它 我想读入该文件并将其转换为 MimeMessage 如果您好奇为什么 我设置了 JavaMaildir 并且需要用电子邮件填充它的收件箱以
  • java库维护数据库结构

    我的应用程序一直在开发 所以偶尔 当版本升级时 需要创建 更改 删除一些表 修改一些数据等 通常需要执行一些sql代码 是否有一个 Java 库可用于使我的数据库结构保持最新 通过分析类似 db structure version 信息并执
  • 是否可以使用 Java Guava 将函数应用于集合?

    我想使用 Guava 将函数应用于集合 地图等 基本上 我需要调整 a 的行和列的大小Table分别使所有行和列的大小相同 执行如下操作 Table
  • 使用按钮作为列表的渲染器

    我想使用一个更复杂的渲染器 其中包含列表的多个组件 更准确地说 类似于this https stackoverflow com questions 10840498 java swing 1 6 textinput like firefox
  • 在java中使用多个bufferedImage

    我正在 java 小程序中制作游戏 并且正在尝试优化我的代码以减少闪烁 我已经实现了双缓冲 因此我尝试使用另一个 BufferedImage 来存储不改变的游戏背景元素的图片 这是我的代码的相关部分 public class QuizApp

随机推荐

  • Flutter 插件数据回调

    在编写Flutter插件时 涉及到结果回调 进度回调的时候 可以选择使用PlatformChannel BlockCallback或FlutterEventChannel 下面简单说一下他们的使用场景 1 PlatformChannel P
  • 数据链路层协议

    一 数据链路层概述 1 数据链路层的功能 1 链路管理 负责数据链路的建立 维持和释放 主要用于面向连接的服务 2 帧同步 接收方确定收到的比特流中一帧的开始位置和结束位置 3 差错控制 用于使接收方确定接收到的数据就由发送方发送的数据 4
  • 程序员升级打怪之路

    程序员升级打怪之路 新手阶段 中级阶段 高级阶段 写这篇文章的目的是为了让自己在迷茫的时候 看看 自己有哪些不足之处 最重要的是在目前这个时间2020年11月3日 我还是处在中级阶段 新手阶段 那么 入门的新手 要达到一个什么水平才能找到工
  • 学习率的选择

    学会画图去看学习率是否符合 梯度下降算法收敛所需要的迭代次数根据模型的不同而不同 我们不能提前预知 我们可以绘制迭代次数和代价函数的值的图表来观测算法在何时趋于收敛 自动测试方法 也有一些自动测试是否收敛的方法 例如将代价函数的变化值与某个
  • Datart使用说明

    Datart使用说明 Datart安装记录 Refer 安装问题 前端源码编译 java 程序包datart data provider calcite parser impl不存在 启动基础步骤 Datart安装记录 Refer 最近在学
  • 只需2步,轻松解决高校“双非”网站问题

    什么是高校 双非 信息系统问题 高校 双非 信息系统 网站 问题是指 大部分高校网站都是教育网公网地址 互联网可以直接访问 但是 有些高校网站存在下面两种情况 第一种 学校拥有一个教育网地址A 在公网上又有一个非法域名 也对应学校的公网地址
  • SpringBoot报错Unable to start embedded container; nested exception is java.lang.NoSuchMethodError

    SpringBoot启动报错如下 Unable to start embedded container nested exception is java lang NoSuchMethodError org apache tomcat ut
  • CloudCompare和PCL体素滤波:优化点云数据处理

    CloudCompare和PCL体素滤波 优化点云数据处理 介绍 点云数据处理在计算机视觉和机器人领域扮演着重要角色 然而 原始的点云数据可能包含噪声 离群点和冗余信息 这可能对后续的分析和应用造成负面影响 为了解决这些问题 我们可以使用体
  • [BJDCTF2020]Mark loves cat(解决githack无法下载源码&&githack无法获取文件)

    写在前面 考察知识点 1 git泄露 点击这里下载 选择安装路径后 在该文件夹下路径输入cmd 在命令行中输入 python Githack py 127 0 0 1 git 你的网址后面有 git就行 2 变量覆盖 这里有一题比较简单的变
  • 2022数模国赛C题思路详解-古代玻璃制品的成分分析与鉴别

    完整作品 含代码 文献 数据集 分类答案 正在为您运送作品详情 题目定位 数据分析题 数据量少 维度较多 参考往年题目 2021年国赛B题 一 题目背景分析 这几段主要是交代题目的背景 讲解了古代玻璃制品的特征 解释了其化学成分含量的差异性
  • 手动配置树莓派wifi联网连接热点手机热点

    手动配置树莓派wifi联网连接热点 修改wifi配置文件 运行命令 sudo nano etc wpa supplicant wpa supplicant conf 在文件中添加无线网配置信息 ctrl interface DIR var
  • 使用 Clang Tools —— ClangFormat

    ClangFormat 1 独立的工具 2 Vim 集成 3 Emacs 集成 4 BBEdit 集成 5 CLion 集成 6 Visual Studio 集成 7 用于补丁重新格式化的脚本 Script for patch reform
  • JavaScript中获取对象属性的不同方法

    JavaScript中获取对象属性的不同方法 文章目录 JavaScript中获取对象属性的不同方法 一 点记法 二 方括号记法 三 Object keys 方法 四 Object values 方法 五 Object entries 方法
  • uniapp路由传多个参数_VUE全局路由前置守卫:路由拦截登录校验

    点击右上方红色按钮关注 web秀 让你真正秀起来 前言 在任何一个平台中 如果需要增加用户黏度 除了用户需要的基本内容外 用户登录注册提交信息也是非常重要的一环 可以了解用户基本信息 用户喜欢等 抛出前后端混合开发外 vue可以轻松的实现路
  • Hyperf中RabbitMQ的使用

    1 简单的使用可以参照官方文档的AMQP组件 https hyperf wiki 2 1 zh cn amqp 2 安装过程参照 https www linuxprobe com install rabbitmq on centos 7 h
  • Qt实现点击按钮弹出(关闭)窗口,点击窗口外其他位置关闭窗口

    Qt实现点击按钮弹出 关闭 窗口 点击窗口外其他位置关闭窗口 方法一 在窗口实现类的构造函数中添加如下代码 this gt setWindowFlags Qt Popup 参数Qt Popup 表示 当点击窗口以外就关闭窗口 方法二 直接在
  • python 图片、文件 通过 request header 多线程下载

    写爬虫过程中发现图片下载比较慢 遂使用多线程下载来提速 import threading import requests class MulThreadDownload threading Thread def init self url
  • select回显注意问题

    span style font size 18px js代码 span span style font size 18px var roleName entity roleId 5 roleId val roleName span span
  • 网络安全应急响应预案培训

    应急响应预案的培训是为了更好地应对网络突发状况 实施演 练计划所做的每一项工作 其培训过程主要针对应急预案涉及的相 关内容进行培训学习 做好应急预案的培训工作能使各级人员明确 自身职责 是做好应急响应工作的基础与前提 应急响应预案的培 训分
  • 2024年java面试--mysql(3)

    系列文章目录 2024年java面试 一 spring篇 2024年java面试 二 spring篇 2024年java面试 三 spring篇 2024年java面试 四 spring篇 2024年java面试 集合篇 2024年java