哪家公司网站建设口碑好/百度推广登录平台app
一、慢查询
1、常见情形
聚合查询
多表查询
表数据量过大查询
深度分页查询
2、定位慢查询
方案一、开源工具
- 调试工具:Arthas
- 运维工具:Prometheus、Skywalking
方案二、MySQL自带慢日志
在MySQL配置文件 /etc/my.conf
中配置:
# 开启MySQL慢日志开关
slow_query_log=ON
# 设置慢日志时间2秒,超过2秒的SQL语句会被认为是慢查询,记录慢查询日志
long_query_time=2
# 慢日志记录文件
slow_query_log_file =/var/lib/mysql/localhost-slow.log
重启MySQL服务器,后续可在对应日志文件中查看慢日志信息。
3、慢SQL优化
- 聚合查询,考虑增加临时表
- 多表查询,优化SQL语句
- 表数据量过大,增加索引
- 深度分页查询,
其中,聚合查询、多表查询、数据量过大的情况,均可以使用SQL执行计划分析,进行优化。使用MySQL自带命令 explain 或 desc :
EXPLAIN/DESC + 原SQL语句
字段含义
- possible_key,当前SQL可能会使用到的索引;
- key,当前SQL实际命中的索引;
- key_len,索引"key"占用空间大小;
- Extra,额外的优化建议;
- Using where;Using index:使用了索引,需要的数据在索引中都能够找到,不需要回表查询。
- Using index condition:使用了索引,但是需要回表查数据。
- type,该SQL数据访问/操作的类型,性能从好到差依次为:NULL、system、const、eq_ref、ref、range、index、all。
- ALL,扫描全部数据,MySQL将遍历全表以找到匹配的行;
- index,遍历索引,索引树扫描;
- range,索引范围查找;
- ref,使用非唯一索引查找数据;
- eq_ref,类似ref,区别是使用的索引为唯一索引,对于每个索引的键值,表中只有一条记录匹配。
- const,根据主键查询;
- system,查询mysql自带的表;
Q:某条SQL查询很慢,如何分析?
A:可以使用MySQL自带分析工具EXPLAIN。
- 通过key和key_len检查是否命中了索引(索引本身存在是否有失效的情况)
- 通过type字段查看sql是否有进一步的优化空间,是否存在全索引扫描或全盘扫描
- 通过extra建议判断,是否出现了回表的情况,如果出现了,可以尝试添加索引或修改返回字段来修复
二、MySQL存储引擎
1、分类
存储引擎是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎基于表,而非基于数据库。
# 特性 | MyISAM | InnoDB | MEMORY |
---|---|---|---|
事务 | × | ✔ | × |
锁机制 | 表锁 | 表锁、行锁 | 表锁 |
外键 | × | ✔ | × |
在mysql中提供了很多的存储引擎,比较常见有InnoDB、MyISAM、Memory
- InnoDB存储引擎是mysql5.5之后是默认的引擎,它支持事务、外键、表级锁和行级锁
- DML操作遵循ACID模型,支持事务;
- 行级锁,提高并发性能;
- 支持外键,FOREIGN KEY 约束,保证数据的完整及正确性。
- MyISAM是早期的引擎,不支持事务、只有表级锁、也没有外键,用的不多
- Memory主要把数据存储在内存,支持表级锁,没有外键和事务,用的也不多
2、体系结构
三、索引
索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构(B+树),这些数据结构以某种方式指向数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
1、B树
2、B+树
MySQL的InnoDB引擎采用的B+树的数据结构来存储索引
- 阶数更多,路径更短
- 磁盘读写代价B+树更低,非叶子节点只存储指针,叶子阶段存储数据
- B+树便于扫库和区间查询,叶子节点是一个双向链表(叶子节点内部为单向链表)。
B树与B+树对比:
①:磁盘读写代价B+树更低;②:查询效率B+树更加稳定;③:B+树便于扫库和区间查询
3、聚簇索引与非聚簇索引
聚簇索引,数据存储和索引在一块,索引结构的叶子节点保存了行数据。聚簇索引在每张表中都有且仅有一个。
非聚簇索引(二级索引),将数据与索引分开存储,叶子节点关联的内容为对应的主键。一张表可以有多个二级索引。
聚集索引选取规则:
- 如果存在主键,主键索引就是聚集索引。
- 如果不存在主键,将使用第一个唯一索引(UNIQUE)作为聚集索引。
- 如果表没有主键,且没有合适的唯一索引,则 InnoDB 会自动生成一个rowid作为隐藏的聚集索引。
回表查询:通过二级索引找到对应的主键,然后根据主键值通过聚簇索引找到对应的行数据,这个查找的过程称为回表。
4、覆盖索引
覆盖索引:指查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到 。
- 使用id查询,直接走聚集索引查询,一次索引扫描,直接返回数据,性能高。
- 如果返回的列中没有创建索引,可能会触发回表查询,尽量避免使用 select *。
# 超大分页问题处理,
数据量较大的情况,使用 limit 分页查询,查询越靠后,查询效率越低。
优化思路:一般分页查询时,通过创建 覆盖索引 能够比较好地提高性能,可以通过 覆盖索引 + 子查询 的形式进行优化。
select * from tb_sku t,(select id from tb_sku order by id limit 90000,10) a
where t.id = a.id;
Q:超大分页怎么处理?
A:超大分页一般在数据量较大时,使用了limit分页查询,且需要对数据进行排序。这种情况下查询的效率就会比较低,可以采用覆盖索引和子查询解决。
首先,分页查询数据的主键id字段,然后用子查询来过滤,只需要查询这个id列表中的数据即可。因为查询id的时候走的是覆盖索引,所以效率会提升。
5、创建索引的原则
依次考虑:主键索引、唯一索引、复合索引(根据业务情况创建);
原则:
- 数据量较大,且查询比较频繁的表创建索引;(例,>10万条)
- 针对查询条件 where 、排序 sort by 、分组 group by 等操作的字段创建索引;
- 选择区分度高的字段作为索引,优先创建唯一索引,检索效率高;
- 字符串类型的字段,如果长度较长,可以考虑创建前缀索引;(取字段的前一部分)
- 涉及多字段作为查询条件的情况,尽量使用联合索引,减少单列索引。联合索引很多时候可以覆盖索引,可以避免回表,节省存储空间;
- 需要控制索引的数量,索引数量越多,维护索引的代价也越大,同时影响增删改的效率;
- 如果某个字段不能存储NULL值,建表语句对应该字段应当使用 NOT NULL 约束。当优化器知道每列是否包含NULL值时,它可以更好地确定哪个索引最有效地用于查询。
6、索引失效的情况
(1)判断索引是否失效
explain 命令,例:
假设我们在student表中有一个联合索引“idx_age_name_grade (name,age, grade)”
explain select * from student where name = "zhangsan" and age = 20 and grade = 3;
explain select * from student where name = "zhangsan" grade = 3;
explain select * from student where age = 20 and grade = 3;
可以通过对比上述语句的输出内容,key 、 key_len ...,查看索引的使用情况。
(2)失效的场景
- 使用聚合索引,违反最前左缀原则(如,上述student表,查询条件无name且包括age或grade的情况);
- 联合索引,查询语句使用了范围查询,右边的列索引不会生效(如,select * from student where name = "zhangsan" and age > 20 and grade = 3;范围查询“age > 20” 右侧的 grade 字段索引不生效 );
- 在索引列上进行了运算,索引会失效;
- 字符串对应的字段查询语句不加引号,出现类型转换,引起失效;
- like查询,以 % 开头的模糊查询(如果仅仅是以 % 结尾的 like 查询,索引不会失效);
- or 前后没有同时使用索引;
- 索引字段使用了 IS NULL 、IS NOT NULL、not、!= 等;
- mysql评估全表扫描比使用索引查询快
注意:联合索引的情况,如果只是查询条件里的查询顺序和索引定义的顺序不同,不影响走索引。索引优化器会对查询条件进行优化,即进行重新排序。
7、SQL优化总述
涉及方面:
- 表的设计优化
- 选用合适的字段类型
- SQL语句优化 && 索引优化:关联 “5、索引创建原则”、“6、索引失效情况”
- 尽量避免使用 select *,防回表
- Join优化:能用innerjoin 就不用left join right join,如必须使用 一定要以小表为驱动。内连接会对两个表进行优化,优先把小表放到外边,把大表放到里边。left join 或 right join,不会重新调整顺序。
- 主从复制、读写分离
- 分库分表
(1)主从复制
(2)分库分表
四、事务
事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
1、事务的特性ACID
- 原子性 Automaticity:事务是不可分割的工作单位,要么全部成功,要么全部失败;
- 一致性 Consistency:事务将数据库从一种状态转变为下一种一致的状态;
- 隔离性 Isolation:不受并发操作的影响,事务提交前对其他事务不可见;
- 持久性 Durability:事务一旦提交,其结果就是永久性的。即使发生宕机等故障,数据库也能将数据恢复。
例:A向B操作转账100元,
原子性:A扣除100,B增加100,要么都成功要么都失败;
一致性:数据在事务执行前后一致(转账前后),A扣除了100,B必须增加100;
隔离性:A向B转账,不受其他事务的影响;
持久性:事务提价后,需要将数据持久化(落盘操作)。
2、并发问题
脏读、不可重复读、幻读
- 脏读:一个事务读取了另一个事务还没有提交的内容;
- 不可重复读:一个事务,前后读取同一条记录,获取到的数据内容不同(原因是查询的过程中其他事务做了更新操作);
- 幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了”幻影”(原因是查询过程中其他事务做了添加操作)。
3、事务隔离级别
解决并发事务问题的方案:对事务进行隔离。
(1)四种隔离级别
1)READ UNCOMMITTED(读未提交)
事务中最低的级别,该级别下的事务可以读取到另一个事务中未提交的数据,也被称为脏读( Dirty Read)。
2)READ COMMITTED(读提交)
大多数数据库管理系统的默认隔离级别,例如Oracle。
该级别下,事务只能读其他事务已经提交的内容,可以避免脏读,但不能避免重复读、幻读的情况。
3)REPEATABLE READ(可重复读)
MySQL默认的事务隔离级别,可以避免脏读、不可重复读的问题,确保同一个事务的多个实例在开发并发读取数据时,会看到同样的数据行。该级别在理论上会出现幻读的情况,但MySQL的存储引擎通过多版本并发控制(MVCC)解决了该问题。
4)SERIALIZABLE(串行化)
事务的最高隔离级别,强制对事务进行排序,使事务之间不会发生冲突,从而解决脏读、幻读、重复读的问题。
(2)各隔离级别可能出现的问题
4、undo log && redo log
5、MVCC
参考内容:
B站视频课程:https://www.bilibili.com/video/BV1yT411H7YK
掘金:https://juejin.cn/post/6985026799163932708
相关文章:

Java技术栈总结:数据库MySQL篇
一、慢查询 1、常见情形 聚合查询 多表查询 表数据量过大查询 深度分页查询 2、定位慢查询 方案一、开源工具 调试工具:Arthas运维工具:Prometheus、Skywalking 方案二、MySQL自带慢日志 在MySQL配置文件 /etc/my.conf 中配置: # …...

vue-cli 项目打包优化-基础篇
1、项目打包完运行空白 引用资源路径问题,打包完的【index.html】文件引用其他文件的引用地址不对 参考配置:https://cli.vuejs.org/zh/config 修改vue.config.js ,根据与 后端 或 运维 沟通修改 module.export {// 默认 publicPath: //…...

24/06/26(1.1129)动态内存
strtok 字符串分割函数 #include<stdio.h> int main(){ char str[] "this,a sample string."; char* sep ","; char* pch strtok(str, sep); printf("%s\n", pch); while (pch ! NULL){ printf("%s\…...

基于 elementUI / elementUI plus,实现 主要色(主题色)的一件换色(换肤)
一、效果图 二、方法 改变elementUI 的主要色 --el-color-primary 为自己选择的颜色,核心代码如下: // 处理主题样式 export function handleThemeStyle(theme) {document.documentElement.style.setProperty(--el-color-primary, theme) } 三、全部代…...

js 计算某个日期加月份最后月份不会增加或者跳变
/** * * param {*} dateString 原来日期 2023-12-31 * param {*} months 加月份 2 * returns 2024-02-29 */ export function getDateByMonth(dateString, months0) { console.log(1); let oldMonths dateString.substring(0,7); let day dateString.substring(8); let …...

Git简介与详细教程
一、简介 什么是Git? Git是一款分布式版本控制系统,由Linux之父Linus Torvalds于2005年开发。它旨在快速、高效地处理从小型到大型项目的所有内容。Git与传统的版本控制系统相比,具备显著的优势,主要体现在其分布式架构、强大的…...

创建OpenWRT虚拟机
环境:Ubuntu 2204,VM VirtualBox 7.0.18 安装必备软件包: sudo apt update sudo apt install subversion automake make cmake uuid-dev gcc vim build-essential clang flex bison g gawk gcc-multilib g-multilib gettext git libncurses…...

智慧安防新篇章:如何科学设定可燃气体报警器校准检测周期
随着科技的快速发展,智慧安防系统已成为现代社会不可或缺的一部分。在各类安全监测设备中,可燃气体报警器因其对潜在危险的及时预警功能而备受关注。 接下来,佰德将围绕可燃气体报警器的校准检测周期进行深入探讨,以确保其在智慧…...

如何优化Spring Boot应用的启动时间
如何优化Spring Boot应用的启动时间 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将讨论如何优化Spring Boot应用的启动时间,提升应用的性…...

(Effective C) 2.3 作用域
(Effective C) 2.3 作用域 文章目录 (Effective C) 2.3 作用域前言🔢4大作用域1️⃣文件作用域2️⃣块作用域3️⃣函数原型作用域4️⃣函数作用域 ⭐作用域性质📖实例CodeEND关注我 前言 作用域应用于标识符的某个特定声明。 标识符包含对象࿰…...

Python 基础 (标准库):堆 heap
1. 官方文档 heapq --- 堆队列算法 — Python 3.12.4 文档 2. 相关概念 堆 heap 是一种具体的数据结构(concrete data structures);优先级队列 priority queue 是一种抽象的数据结构(abstract data structures)&…...

动手学深度学习(Pytorch版)代码实践 -卷积神经网络-30Kaggle竞赛:图片分类
30Kaggle竞赛:图片分类 比赛链接: https://www.kaggle.com/c/classify-leaves 导入包 import torch import torchvision from torch.utils.data import Dataset, DataLoader from torchvision import transforms import numpy as np import pandas as…...

【LeetCode】每日一题:数组中的第K大的元素
给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 解题思路 第一种是快排,快…...

Keil5.38ARM,旧编译器(V5)安装
站内文章KEIL5MDK最新版(3.37)安装以及旧编译器(V5)安装_keil5 mdk-CSDN博客...

【perl】脚本编程的一些坑案例
引言 记录自己跳进的【perl】编程小坑,以己为鉴。 1、eq $str1 "12345\n"; $str2 "12345"; if ($str1 eq $str2) { print "OK" } 上述代码不会打印 OK。特别在读文件 ,匹配字符串时容易出BUG。 案例说明: 有…...

MIX OTP——使用 GenServer 进行客户端-服务器通信
在上一章中,我们使用代理来表示存储容器。在 mix 的介绍中,我们指定要命名每个存储容器,以便我们可以执行以下操作: 在上面的会话中,我们与“购物”存储容器进行了交互。 由于代理是进程,因此每个存储容器…...

2024年云安全发展趋势预测
《2024年云安全发展趋势预测》 摘要: 云计算的普及带来了新的安全挑战。本文汇总了多家云安全厂商、专业媒体和研究机构对2024年云安全发展趋势的预测,为企业组织提供了洞察云安全威胁的新视角。 云计算的灵活性和可扩展性使其成为企业关键任务负载的首…...

java.io.eofexception:ssl peer shut down incorrectly
可能是因为 1)https设置 2)超时设置 FeignConfig.java package zwf.service;import java.io.IOException; import java.io.InputStream; import java.security.KeyStore;import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory;import org.apac…...

Unity之HTC VIVE Cosmos环境安装(适合新手小白)(一)
提示:能力有限,错误之处,还望指出,不胜感激! 文章目录 前言一、unity版本电脑配置相关关于unity版本下载建议:0.先下载unity Hub1.不要用过于旧的版本2.不要下载最新版本或者其他非长期支持版本 二、官网下…...

入门JavaWeb之 Response 验证码和重定向
Response 写验证码: package com.demo.response;import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse…...

2024-06-26 问AI: 在大数据模型中,deep speed 是什么?
文心一言 在大数据模型中,DeepSpeed是一个由微软开发并维护的开源深度学习优化库。其主要目的是提高大规模模型训练的效率和可扩展性,帮助开发者更有效率地管理及优化大模型的训练、部署任务。以下是DeepSpeed的主要特点和功能: 提高效率和…...

mobaxterm x11 转发Ubuntu mac
目录 royal tsx —— 一款Mac平台MobaXterm平替工具 mobaxterm x11 转发Ubuntu 软件 royal tsx —— 一款Mac平台MobaXterm平替工具 Royal Apps Termius Mac mobaxterm x11 转发Ubuntu 软件 所以直接在 ssh 的时候加上 - X 就可以了 ssh -X -p xxx usernameIP 运行 xclock …...

python数据分析实训任务三(‘职业’)
import pandas as pd import matplotlib.pyplot as plt data pd.read_csv(rC:\Users\XXGC\Desktop\职业2.csv,\ encodinggb2312) # 创建 DataFrame df pd.DataFrame(data) # 分析年龄和工资的关系 plt.scatter(df[年龄], df[工资]) plt.xlabel(年龄) pl…...

vscode连接SSH
1、安装Remote-SSH插件 2、点击左下角,选择SSH 3、点击连接到主机后,添加新的SSH主机,示例ssh 用户ip 4、点击服务器,输入密码登录服务器 5、可在远程资源管理器选项卡中查看 6、可以在ssh设置中打开ssh配置文件 config中的文件…...

金融科技行业创新人才培养与引进的重要性及挑战
金融科技行业作为金融与科技的深度融合产物,正以前所未有的速度改变着传统金融业的格局。在这一变革中创新人才的培养与引进成为了行业发展的核心驱动力。然而,尽管其重要性不言而喻,但在实际操作中却面临着诸多挑战。 一、创新人才培养与引进…...

【C++题解】1714. 输出满足条件的整数4
问题:1714. 输出满足条件的整数4 类型:简单循环 题目描述: 输出 1∼n 中含有数字 3 或者含有数字 5 ,且因数有 2 (即能被 2 整除)的所有整数。(n<1000) 输入: 从键盘输入一个…...

如何安装和配置 Django 与 Postgres、Nginx 和 Gunicorn
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 先决条件 本教程假设您已经在Debian 7或类似的Linux发行版(如Ubuntu)上设置了您的droplet(VPS&#…...

Graphwalker基于模型的自动化测试
Graphwalker 基于模型的自动化测试 基于模型的自动化测试(Model-Based Testing,MBT)作为一种创新的测试方法,正逐渐受到广泛关注。Graphwalker 作为一款强大的基于模型的自动化测试工具,为我们提供了一种高效、全面的…...

Macbook M1 Fusion安装Debian/Linux
背景 本人主力工作电脑已经迁移到苹果芯片m1的macbook上,曾经尝试使用Fusion安装CentOS、OpenEuler、Ubuntu的一些版本,都没有安装成功。最近开始研究Linux/Unix系统编程,迫切需要通过VMware Fusion安装一台Linux操作系统的虚拟机。 Linux安…...

ERP收费模式是怎样的?SAP ERP是如何收费的?
一、购置SAP ERP系统的费用组成 1、软件费用 传统的ERP系统大多为许可式,即企业在购买ERP服务时付清所有费用,将ERP系统部署于自己的服务器中。根据所购买ERP系统品牌的不同,价格上也有一定的差异。采购ERP系统许可后,后续维护、…...