当前位置: 首页 > news >正文

掌握高性能SQL的34个秘诀多维度优化与全方位指南

掌握高性能SQL的34个秘诀🚀多维度优化与全方位指南

本篇文章从数据库表结构设计、索引、使用等多个维度总结出高性能SQL的34个秘诀,助你轻松掌握高性能SQL

SQL图.png

表结构设计

字段类型越小越好

满足业务需求的同时字段类型越小越好

字段类型越小代表着记录占用空间可能就越小,页中存在的记录就可能越多,相同IO次数加载的数据就可能更多

字段越小建立索引时耗费的空间就越小,如果该字段是主键那么它还会在二级索引上存储,因此主键也是越小越好

数字类型的选择

数字类型包括整形、浮点型、定点数类型

在不同的场景下可以选择不同的类型

整形

整形通常是tinyint ~ bigint

根据越小越好的原则,对于存储枚举类型的字段使用tinyint进行存储(0-x),而不必使用字符串进行存储

int(1) 和 int(10) 占用的空间无区别,只是int(10)在数据不满10位时进行补零

善用无符号 UNSIGNED 可以提高一倍的容量,比如一些不需要负数的场景(主键、人的年龄 tinyint unsigned 255够用)

浮点型

浮点型常用于存储有小数部分的数据

其中包括float、double类型

注意使用浮点数类型时可能发生精度丢失,如果不想丢失精度可以选择定点数类型

定点数类型

decimal 常用于存储有小数、需要计算且不能发生精度丢失的数据

字符类型的选择

常用的字符类型有char和varchar

char存储固定字符,当存储字符长度未满时使用空格填充,因此它无法存储末尾空格,在修改时它能够在原记录上进行修改

varchar相当于char空间换时间的版本,它是可变长字段会多使用1-2个字节记录可变长长度

varchar(255)前1个字节,255后2个字节,但也不是长度不超过255就全部都使用255,在某些存储引擎下会根据长度直接分配空间(如memory),使用临时表默认使用memory,因此在临时表排序时可能会导致占用空间太多

varchar在面对频繁的修改时,还可能造成重建记录、页分裂等问题

固定长度、频繁的修改可以选择char

不定长、末尾要存储空格时可以选择varchar,varchar长度也要尽量小

注意存表情使用utf8mb4字符编码

在某些场景下,整形替换字符存储会更省空间,也可以考虑整形 比如存储IP

具体内容感兴趣的同学可以查看这篇文章:千万数据下varchar和char性能竟然相差30%🚀

时间类型的选择

根据越小越好原则,只需要年、日期、时间时选择year、date、time

需要详细日期时可以选择datetime和时间戳的方式

datetime固定时间、无时区、可视化较好

timestamp时间戳,有时区(根据服务端时区)、有时间范围限制、使用系统时区并发下性能没那么好、可视化不好

使用整形存储时间戳,性能好,可以自由转换时区,可视化不好

不考虑时区、可视化要好大部分场景下可以使用datetime

考虑时区(需要自由转换时区)、追求性能、不注重可视化可以选择整形存储时间戳(无符号int 目前够用)

具体内容感兴趣的同学可以查看这篇文章:时间类型该如何选择?千万数据下性能提升10%~30%🚀

文本、文件类型的选择

文本相关可以选择TEXT相关类型,使用时最好与常用列进行垂直拆分,避免内容太多影响其他列的查询

文件相关可以存储到文件服务器后,在数据库中使用字符类型(varchar)进行存储文件所在地址

如果一定要存则使用BLOB相关类型存储二进制数据

尽量满足主键递增

主键最好考虑是递增的,因为聚簇索引需要保证主键值的有序

当主键递增时,只需要在末尾增加记录即可

当入库的主键值无序时,可能会导致页分裂,需要维护有序性的开销

单机下可以使用主键自增,分布式下可以使用全局自增的算法(雪花算法等)

考虑打破范式增加冗余

一般表结构的设计是遵循三范式的

在某些场景下,可以给一些需要关联的表增加冗余,从而避免联表查询

比如一条记录是由某个设备生成的,该记录肯定需要保留字段去关联设备,

需求是知道该记录由哪个设备生成的即可,因此查询时只需要关联查询设备名称,而设备名称又不会经常改变

对于追求性能的场景,可以将设备名称冗余存储在记录上,从而避免联表查询

计算量太大考虑中间表

对于需要大量计算的场景(比如统计数据、每日排行榜等),每次查询都经过大量计算来统计数据是不现实的

通过增加中间表的方式先进行统计,后续查询时直接查中间表

比如定时任务统计每天数据量、每日排行,计算后,将结果(不同类型的数据量、排行榜TOP100)记录在中间表上,后续有请求则直接查中间表

索引

为常用于查询的列建立索引

索引带来的好处是在大数据量下能够快速检索到满足查询条件的记录

索引会根据选择的列构建成一颗索引列有序的B+树,比如根据age,student_name建立索引

索引(age,student_name)中只存储索引列(age、student_name)和主键(id)

并且索引中需要把age、student_name、id维护成有序

(整体上age有序,age相等时student_name有序,student_name相等时id有序)

image.png

列有较多where条件查询的语句时考虑为其建立索引

为常要排序(order by、group by)列创建索引

索引会维护列的有序性,为 order by 的列建立索引时,在索引上列本身就是保持有序的,不会再使用临时表进行排序

group by 也会进行排序(使用索引的好处同上),在其基础上还会进行去重

如果无法创建索引会使用sort buffer进行排序,可以考虑调大sort buffer加快速度

如果数据量太大的排序还会借助磁盘辅助排序,这种场景下最好还是建立索引

对排序感兴趣的同学可以查看这篇文章:怎样处理排序⭐️如何优化需要排序的查询?

考虑为联表查询中被驱动表关联列适当建立索引

在联表查询中关联的表越多,时间复杂度会呈指数型增长

其中每访问一次驱动表,就可能访问多次被驱动表,需要适当为被驱动表关联列建立索引,加快查询被驱动表的速度

SELECTs1.*,s2.seat_code 
FROMstudent s1left JOIN seat s2 ON s1.id = s2.student_id 
WHERE s1.student_name = 'caicai'

如这段SQL中,s1使用左连接为驱动表,s2为被驱动表

s1使用(student_name)索引,s2暂时没索引

可以考虑为s2的student_id建立索引,由于只查询s2的seat_code,也可以考虑建立(student_id,seat_code)联合索引,使用覆盖索引避免查s2时回表再查seat_code

对连表查询感兴趣的同学可以查看这篇文章:连接的原理⭐️4种优化连接的手段性能提升240%🚀

考虑为字符串长度太长、开头能够区分的列建立前缀索引

为太长的字符串列直接建立索引时会导致占用空间太大

当列中存储的值,前面部分为区别度较高的值时,可以考虑为其建立前缀索引

例如某产品编码长度20,其中后面15个字符重复性很高,前5个字符重复性低区分度高,就可以考虑为前5个字符建立前缀索引

需要注意的是,前缀索引只存储该列前缀部分的值,如果要获取列的完整信息就要进行回表

列中重复值太多,不建议建立索引

当列中重复值太多时,它在查询时的区分度不够

其次在使用该索引时(重复值太多cardinality太低),如果要回表MySQL会认为回表开销太大(重复值多、回表数量多),从而导致它不偏向使用该索引

(回表开销:回表需要查询聚簇索引,由于二级索引中的主键值不一定有序,因此回表时可能产生随机IO)

业务唯一要加唯一索引

业务上有唯一性的要求时要加唯一索引

唯一索引的特点是记录唯一,在进行写操作时需要保证记录唯一性,不能使用change buffer等优化,在频繁写的场景下性能会比非唯一二级索引略差

(change buffer:当索引页不在缓冲池时,记录下本次写操作的内容,等后续读到该记录时,再将内容合并加载到缓冲池,避免写的随机IO)

但在查询时唯一索引等值查询会比非唯一索引更快(因为它不允许重复值,而非唯一索引存在重复值)

在业务层通过先读再新增的方式保证唯一时,在并发场景下还是会出现重复值(除非读加锁,但是加锁又会影响性能....)

不能因为唯一索引无法使用change buffer的优化就不使用唯一索引

避免创建过多索引

创建索引是需要考虑成本的,并不是索引越多越好

  1. 索引需要占用空间

  2. 在进行写(增/删/改)操作时,还要维护索引的有序性

  3. 在进行查询时优化器还要基于使用不同的索引对成本进行估算

避免冗余索引

当存在(name)、(age)、(name,age)三个索引时,(name)就成为了冗余索引

因为使用(name)索引的好处(查询条件过滤、有序),使用(name,age)也可以达到

需要注意的是,如果查询SQL中没有age单独查询的(where age = 18),都是基于先查name再查询age的(where name >= 'caicai' and age >= 18),那么age也相当于冗余索引,因为这种场景下使用(name,age)就足够

注意左模糊匹配

字符串的二级索引是根据该列字符排序规则进行排序

当使用左模糊匹配like '%xx'时,由于起始字符不确定导致不便在二级索引中进行检索

对于这种场景,如果数据量小考虑建立全文索引进行检索,如果数据量大考虑使用其他善于全文检索的中间件如ES等(MySQL全文索引耗内存)

注意最左匹配原则

当使用联合索引时,需要前一个索引列等值的情况下,后一个索引列才会有序

比如(a,b,c)中,当a相等时b才有序,当b相等时c才有序

where b<=9 时无法使用联合索引,因为b不一定是有序的,只有当a相等时b才有序

where a>=1 and b<=9中,可以使用上索引中a、b两个列

where a>=1 and c<=9中,只能使用上索引中的a,由于b没有查询条件导致c不一定有序,于是c无法使用索引

但是在8.0高版本中,推出索引跳跃扫描的优化

where a>=1 and c<=9中无法使用c的原因是c不是有序,想要c有序就要让b相等,于是索引跳跃扫描在这种场景下,将遍历a>=1中有序的b(由于b可能重复于是会对b去重)在此基础上c就是有序的,就能够使用上索引,最后将每个遍历的b中满足c<=9的记录进行合并,从而得到最终结果

虽然有索引跳跃扫描的优化,但开销还是大的,需要优化

注意表达式或隐式函数

索引列不要使用表达式,比如:where age + 2 = 10,存储引擎层使用age索引时,不认识age + 2就会导致索引失效

同理,索引列也不能使用函数,CAST(age AS CHAR) = '8'也会导致索引失效

需要注意:有时容易隐式给索引列加函数导致索引失效

code = 10 code为字符串,字符串会隐式使用函数向数字转换 CAST(code AS UNSIGNED) = 10 从而导致索引失效

对索引失效感兴趣的同学可以查看这篇文章:完蛋!😱 我被MySQL索引失效包围了!

注意回表

当使用二级索引时,如果使用的查询条件不够有区别度is null、is not null、or(NULL 默认情况下被认为重复值),又或者该重复值太多(cardinality太低),都会导致MySQL认为要回表的记录太多,从而不偏向使用索引,导致索引失效

注意优化器可能用错索引

优化器会估算计算每个索引的成本,当扫描数据量较大并且更新数据太频繁时,会影响计算的成本,从而导致优化器使用错索引

这种情况下可以在空闲时手动更新统计 analyze table

或者强制使用索引 force index

使用

避免select *

select * 方便书写SQL,易于偷懒

虽然平时的开发中也会用到,但是要知道它会带来开销:

  1. 占用网络带宽(读取不必要的列通过网络返回给客户端,数据量大的情况下是一笔不小的开销)
  2. 无法使用覆盖索引,使用二级索引时会回表(如果需要的列正好都在二级索引上,那么就可以使用覆盖索引不用回表)
  3. 联表查询使用join buffer时会占用join buffer的空间(join buffer是联表查询被驱动表无法使用索引时的优化,占用其空间会导致联表性能下降)
常用explain

每次在书写业务的SQL时可以使用explain查看执行计划

根据业务需求、执行计划判断该SQL是否满足当前场景的性能要求

explain中需要注意的几部分:

  1. type 避免出现全表扫描ALL,最好使用const、ref、range等
  2. possible_keys 可能用到的索引 和 key 实际用到的索引,注意查看优化器是否选错索引
  3. 联表查询时注意查看key_len 使用索引长度,避免部分索引列未使用到
  4. 注意附加信息extra中的 排序、临时表等
查询时少用is null、is not null、or、!=...

null默认被认为重复值,is null、is not null、or、!=会被认为重复值太多

当重复值太多(回表开销大)MySQL会不偏向使用索引,导致索引失效

注意联表性能

注意联表查询的时间复杂度是呈指数形式增长的,联表越多性能越差,但是有的B端又必须进行联表查询

提供以下几点方案优化联表:

  1. 适当为被驱动表关联列建立索引(如果使用索引后随机IO关联被驱动表是瓶颈,考虑开启BKA)
  2. 无法建立索引的情况会使用join buffer优化,尝试调大join buffer空间或减少select查询的列
  3. 使用小表驱动大表,能用内连接就用内连接(让MySQL选择驱动表)
  4. 不经常变化的列做冗余,避免联表
统计全部数量尽量使用count(*)

在统计数量时都会使用count函数

count(主键/1/*)都会基于空间最小的二级索引进行统计(统计快)

全局数量统计时尽量使用count(主键)/count(1)/count(*)等,不要使用count(二级索引列),可能当初该列的索引确实是空间最小的,但后面还可能建立比它空间更小的二级索引(除非是指定统计该列行数)

count(*)是定义的数据库标准统计行数的语法,虽然几个写法使用起来都差不多,但它会规范些

注意优化深分页

深分页问题是由于分页偏移量太大导致的问题

select * from student where age = 18 limit 5000,10 使用二级索引 age 偏移量太多(要回表的数据量太大)导致索引失效

可以使用以下六种方式优化深分页

  1. 业务需求沟通,避免出现深分页
  2. 使用覆盖索引优化
  3. 使用游标分页
  4. 使用子查询
  5. 使用in、子查询
  6. 使用内连接、子查询

对深分页感兴趣的同学可以查看这篇文章:深分页怎么导致索引失效了?提供6种优化的方案!

读写善用limit

查询时携带limit可以更快的返回结果,避免额外的查询

比如我只需要查询一条记录时limit 1(不是指limit 10000,1 这种深分页哈)

在写操作(修改/删除)时携带limit会限制写的行数,避免误操作数据

数据量小且要查多次考虑冗余查询

对于一些数据量小,但是又要多次查询的场景,可以考虑Java服务先冗余查询再进行处理,避免多次查询的网络IO开销

比如一些权限的树级目录,无论是通过队列来广度优先搜索还是递归来深度优先搜索,都需要多次查库

频繁写考虑批处理

客户端频繁的进行单次修改/删除/新增的操作不仅有网络IO开销还耗损MySQL服务端资源、无法使用批处理优化

这种场景下调整为批量处理可以节约资源增大性能

比如一些异步日志记录需要入库,但又会频繁触发,可以考虑改为异步的批量入库

需要注意如果批处理操作中的数量很多,考虑分批处理,每批处理一部分,避免成为长事务

避免出现长事务

在使用spring的声明式事务时,用的很爽但稍微不注意就可能导致长事务

比如一些没必要存在事务中的读操作

或者在同一个事务中,先进行写操作然后又去读数据(一顿操作后才提交事务),这可能导致写操作获取的行锁由于后续的读操作拉长事务导致获取锁的时间变长

又或者一些读大量数据、写大量数据的操作,可以将整个长事务拆分为多个小事务进行处理

考虑事务中写操作执行顺序

平台上有1W积分,用户领取积分时,是先对平台的积分进行扣减,还是先对用户持有积分进行增加呢?

在对于事务中写操作的执行顺序,应该让共享、竞争更大的资源靠后执行(提交事务前),尽可能的缩短它持有资源的时间

应该把平台扣减积分放在提交事务前,因为平台积分相当于共享资源,大家都可以领取扣减

考虑调整事务隔离级别

MySQL默认的事务隔离级别为RR(可重复读),在该隔离级别下能够防止脏读、不可重复读、大部分幻读

但加的行锁和持有时间会比RC(读已提交)级别下要多和更久

因此当业务只需要满足防止脏读的情况下可以调整隔离级别为RC增大并发性能

具体加锁规则后续文章再进行讨论

注意调整架构

当业务上使用缓存、异步等多种优化手段后,对于一些需要实时读写的操作还是要走DB,而此时DB面对大量这种操作可能产生瓶颈

当DB遇到瓶颈时,我们需要分析清楚瓶颈并规划DB的架构,比如瓶颈是由于并发量大连接池不够?还是数据量太多查询太慢?

可以先将架构规划为读写分离架构,从节点分摊主节点的压力

当读写分离架构依旧无法满足业务时考虑分库分表(提前分析好瓶颈再规划拆分策略)

常用的手段是:并发量大分库,数据量大分表,而分库分表又会带来一系列需要解决的问题,如:分布式事务,如何路由、联表、聚合等

最后(不要白嫖,一键三连求求拉~)

本篇文章被收入专栏 MySQL进阶之路,感兴趣的同学可以持续关注喔

本篇文章笔记以及案例被收入 gitee-StudyJava、 github-StudyJava 感兴趣的同学可以stat下持续关注喔~

有什么问题可以在评论区交流,如果觉得菜菜写的不错,可以点赞、关注、收藏支持一下~

关注菜菜,分享更多干货,公众号:菜菜的后端私房菜

本文由博客一文多发平台 OpenWrite 发布!

相关文章:

掌握高性能SQL的34个秘诀多维度优化与全方位指南

掌握高性能SQL的34个秘诀&#x1f680;多维度优化与全方位指南 本篇文章从数据库表结构设计、索引、使用等多个维度总结出高性能SQL的34个秘诀&#xff0c;助你轻松掌握高性能SQL 表结构设计 字段类型越小越好 满足业务需求的同时字段类型越小越好 字段类型越小代表着记录占…...

美国纳斯达克大屏怎么投放:投放完成需要多长时间-大舍传媒Dashe Media

陕西大舍广告传媒有限公司&#xff08;Shaanxi Dashe Advertising Media Co., Ltd&#xff09;&#xff0c;简称大舍传媒&#xff08;Dashe Media&#xff09;&#xff0c;是纳斯达克在中国区的总代理&#xff08;China General Agent&#xff09;。与纳斯达克合作已经有八年的…...

【MySQL】多表关系的基本学习

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-3oES1ZdkKIklfKzq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…...

Springboot之接入gRPC

1、maven依赖 <properties><!-- grpc --><protobuf.version>3.5.1</protobuf.version><protobuf-plugin.version>0.6.1</protobuf-plugin.version><grpc.version>1.42.1</grpc.version><os-maven-plugin.version>1.6.0…...

2023年中国数据智能管理峰会(DAMS上海站2023):核心内容与学习收获(附大会核心PPT下载)

随着数字经济的飞速发展&#xff0c;数据已经渗透到现代社会的每一个角落&#xff0c;成为驱动企业创新、提升治理能力、促进经济发展的关键要素。在这样的背景下&#xff0c;2023年中国数据智能管理峰会&#xff08;DAMS上海站2023&#xff09;应运而生&#xff0c;汇聚了众多…...

DS:八大排序之堆排序、冒泡排序、快速排序

创作不易&#xff0c;友友们给个三连吧&#xff01;&#xff01; 一、堆排序 堆排序已经在博主关于堆的实现过程中详细的讲过了&#xff0c;大家可以直接去看&#xff0c;很详细,这边不介绍了 DS&#xff1a;二叉树的顺序结构及堆的实现-CSDN博客 直接上代码&#xff1a; …...

Sora:继ChatGPT之后,OpenAI的又一力作

关于Sora的报道&#xff0c;相信很多圈内朋友都已经看到了来自各大媒体铺天盖地的宣传了&#xff0c;这次&#xff0c;对于Sora的宣传&#xff0c;绝不比当初ChatGPT的宣传弱。自OpenAI发布了GPT4之后&#xff0c;就已经有很多视频生成模型了&#xff0c;不过这些模型要么生成的…...

阅读笔记(BMSB 2018)Video Stitching Based on Optical Flow

参考文献 Xie C, Zhang X, Yang H, et al. Video Stitching Based on Optical Flow[C]//2018 IEEE International Symposium on Broadband Multimedia Systems and Broadcasting (BMSB). IEEE, 2018: 1-5. 摘要 视频拼接在计算机视觉中仍然是一个具有挑战性的问题&#xff0…...

Ubuntu学习笔记-Ubuntu搭建禅道开源版及基本使用

文章目录 概述一、Ubuntu中安装1.1 复制下载安装包路径1.2 将安装包解压到ubuntu中1.3 启动服务1.4 设置开机自启动 二、禅道服务基本操作2.1 启动&#xff0c;停止&#xff0c;重启&#xff0c;查看服务状态2.2 开放端口2.3 访问和登录禅道 卜相机关 卜三命、相万生&#xff0…...

《苍穹外卖》知识梳理6-缓存商品,购物车功能

苍穹外卖实操笔记六—缓存商品&#xff0c;购物车功能 一.缓存菜品 可以使用redis进行缓存&#xff1b;另外&#xff0c;在实现缓存套餐时可以使用spring cache提高开发效率&#xff1b;   通过缓存数据&#xff0c;降低访问数据库的次数&#xff1b; 使用的缓存逻辑&#…...

[NSSCTF]-Web:[SWPUCTF 2021 新生赛]easy_sql解析

查看网页 有提示&#xff0c;参数是wllm&#xff0c;并且要我们输入点东西 所以&#xff0c;我们尝试以get方式传入 有回显&#xff0c;但似乎没啥用 从上图看应该是字符型漏洞&#xff0c;单引号字符注入 先查看字段数 /?wllm2order by 3-- 没回显 报错了&#xff0c;说明…...

vue3 codemirror yaml文件编辑器插件

需求&#xff1a;前端编写yaml配置文件 &#xff0c;检查yaml语法 提供语法高亮 。 默认内容从后端接口获取 显示在前端 &#xff0c; 前端在codemirror 插件中修改文件内容 &#xff0c;并提交修改 后端将提交的内容写入服务器配置文件中 。 codemirror 通过ref 后期编辑器…...

力扣经典题:环形链表的检测与返回

1.值得背的题 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode *detectCycle(struct ListNode *head) {struct ListNode*fasthead;struct ListNode*slowhead;while(fast!NULL&&fast->…...

【web | CTF】BUUCTF [BJDCTF2020]Easy MD5

天命&#xff1a;好像也挺实用的题目&#xff0c;也是比较经典吧 天命&#xff1a;把php的MD5漏洞都玩了一遍 第一关&#xff1a;MD5绕过 先声明一下&#xff1a;这题的MD5是php&#xff0c;不是mysql的MD5&#xff0c;把我搞迷糊了 一进来题目啥也没有&#xff0c;那么就要看…...

spring boot Mybatis Plus分页

文章目录 Mybatis Plus自带分页和PageHelper有什么区别&#xff1f;Mybatis Plus整合PageHelper分页 springboot自定义拦截器获取分页参数spring boot下配置mybatis-plus分页插件单表分页查询自定义sql分页查询PageHelper 参考 Mybatis Plus自带分页和PageHelper有什么区别&…...

elementui 中 el-date-picker 控制选择当前年之前或者之后的年份

文章目录 需求分析 需求 对 el-date-picker控件做出判断控制 分析 给 el-date-picker 组件添加 picker-options 属性&#xff0c;并绑定对应数据 pickerOptions html <el-form-item label"雨量年份&#xff1a;" prop"date"><el-date-picker …...

GlusterFS:开源分布式文件系统的深度解析与应用场景实践

引言 在当今大数据时代背景下&#xff0c;企业对存储系统的容量、性能和可靠性提出了前所未有的挑战。GlusterFS作为一款开源的、高度可扩展的分布式文件系统&#xff0c;以其独特的无中心元数据设计和灵活的卷管理机制&#xff0c;在众多场景中脱颖而出&#xff0c;为解决大规…...

第6个-滚动动画

Day 6 - Scroll Animation 1. 演示效果 2. 分析思路 布局 所有的内容进行水平垂直居中&#xff0c;可以使用**margin:0 auto;&#xff0c;也可以使用flex**布局&#xff1a; body {background-color: #efedd6;display: flex;flex-direction: column;justify-content: center…...

配置oracle连接管理器(cman)

Oracle Connection Manager是一个软件组件&#xff0c;可以在oracle客户端上指定安装这个组件&#xff0c;Oracle连接管理器代理发送给数据库服务器的请求&#xff0c;在连接管理器中&#xff0c;我们可以通过配置各种规则来控制会话访问。 简而言之&#xff0c;不同于专用连接…...

[N-142]基于springboot,vue停车场管理系统

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 项目采用前后端分离 前端技术&#xff1a;vueelementUI 服务端技术&#xff1a;springbootmybatis-plus 本项目分为普通用户和管理员…...

DAY53:动态规划(买股票的最佳时机)

Leetcode: 121 买卖股票的最佳时机 代码随想录 1、确定下标和含义 dp[i][0]表示当天持有股票所得的最多现金 do[i][1]表示当天不持有股票的最多现金 2、递推公式 &#xff08;1&#xff09;如果第i天持有股票即dp[i][0]&#xff0c; 那么可以由两个状态推出来 第i-1天就…...

快速实现用户认证:使用Python和Flask配合PyJWT生成与解密Token的教程及示例代码

生成token 与解密 token 和 拦截器 #学习交流 访问 # https://v.iiar.cnimport jwt import datetime from models import XUser from flask import request, jsonify from functools import wrapsSECRET_KEY XPay# 创建token def generate_token(user_id):try:payload {exp:…...

外汇110:外汇做空是什么意思?如何运作?一文读懂

外汇市场允许卖空&#xff0c;就像众多金融市场一样。但什么是卖空呢&#xff1f;如何外汇做空&#xff1f;在本文中&#xff0c;我们将讨论如何做空货币。什么是外汇做空&#xff1f; 外汇做空&#xff08;Short Selling&#xff09;是外汇市场上的一种投资方式。它指的是投资…...

【记录】个人博客或笔记中的数学符号设定

note 这里记录个人博客中常用的数学符号数学格式和对应含义 文章目录 note数与数组索引集合线性代数微积分概率和信息论数据与概率分布函数深度学习中的常用数学表达方式 数与数组 α 标量 α 向量 A 矩阵 A 张量 I n n 行 n 列单位矩阵 v w 单词 w 的分布式向量表示 …...

Redis Sentinel工作原理

Redis Sentinel是Redis的高可用性解决方案。它主要用来监控Redis master和slave服务器的运行状态&#xff0c;并在master宕机时自动进行故障转移&#xff0c;即从slave节点中选举出新的master节点&#xff0c;并让其余的slave节点指向新的master节点。 Redis Sentinel工作原理…...

GEE入门篇|遥感专业术语:理论介绍

本章的目的是介绍遥感图像的一些主要特征&#xff0c;以及如何在Earth Engine中检查它们。我们将讨论空间分辨率、时间分辨率和光谱分辨率&#xff0c;以及如何访问重要的图像元数据。将了解到来自不同卫星平台上的几个传感器的图像数据。在本章的学习完成后&#xff0c;您将能…...

react中如何做到中断diff过程和恢复

workLoop是 实现时间切片 和 可中断渲染的核心&#xff0c;简要说明如下&#xff1a; // 并发任务的入口function workLoopConcurrent() {// Perform work until Scheduler asks us to yield// 有任务 & 是否需要中断while (workInProgress ! null && !shouldYiel…...

python:PyPDF2 从PDF文件中提取目录

我发现 pypdf 和 pypdf2 的作者是同一人&#xff1a;Mathieu Fenniak pip install pypdf2 ; pypdf2-3.0.1-py3-none-any.whl (232 kB) 编写 pdf_read_dir.py 如下 # -*- coding: utf-8 -*- """ pypdf23.0.1 从PDF中提取目录 """ import os…...

Java 2:运算符、表达式和语句

2.1 运算符与表达式 Java提供了丰富的运算符&#xff0c;如算术运算符、关系运算符、逻辑运算符、位运算符等。Java语言中的绝大多数运算符和C语言相同&#xff0c;基本语句如条件分支语句&#xff0c;循环语句等&#xff0c;也和C语言类似。 2.1.1算术运算符与算术表达式 1…...

批量提取word文件中文本框内容的三种方法

一、问题的提出 在日常的办公中&#xff0c;有时需要提取多个word文件中的文字框的内容。有时&#xff0c;文字框的数量比较多&#xff0c;而且处于文档的不同位置&#xff0c;手工提取比较耗时耗力&#xff0c;同时也可能会产生遗漏。 我们也可以通过VBA和Python来解决这个问…...

Leecode之合并两个有序链表

一.题目及剖析 https://leetcode.cn/problems/merge-two-sorted-lists/description/ 二.思路引入 用指针遍历两个链表并实时比较,较小的元素进行尾插,然后较小元素的指针接着向后遍历 三.代码引入 /*** Definition for singly-linked list.* struct ListNode {* int va…...

陶建国教授谈中西方文化的差异与交融

龙年到来&#xff0c;这个春节里&#xff0c;“龙”字的英文翻译引发关注&#xff0c;冲上了热搜&#xff0c;网友发现&#xff0c;“龙”不再翻译为“dragon”&#xff0c;而是龙字的谐音“loong”。原来&#xff0c;在西方人的眼里&#xff0c;龙是凶猛的怪兽&#xff0c;具有…...

Ps:画笔选项

画笔选项 Brush Options提供了对画笔&#xff08;圆形笔刷&#xff09;基本属性的控制&#xff0c;比如大小、硬度、间距、角度和圆度等。 Photoshop 中的快速选择工具、污点修复画笔工具、修复画笔工具、颜色替换工具、背景橡皮擦工具等的工具选项栏上提供了这种圆形笔刷选项。…...

嵌入式——Flash(W25Q64)

目录 一、初识W25Q64 1. 基本认识 2. 引脚介绍 ​编辑 二、W25Q64特性 1. SPI模式 2. 双输出SPI方式 三、状态寄存器 1. BUSY位 2. WEL位 3. BP2、BP1、 BP0位 4. TB位 5. 保留位 6. SRP位 四、常用操作指令 1. 写使能指令&#xff08;06h&#xff09; 2. 写禁…...

stm32:pwm output模块,记录一下我是用smt32,输出pwm波的记录--(实现--重要)

我是实现了输出pwm波,频率固定,占空比可以不断调整的方法,将PA0接到示波器上,可以看到是一个标准的PWM波,如图下面示波器图。 1,首先是ioc的配置 我刚开始设置的分频的倍数是7199,使得分频的太大了,示波器显示不了,最后修改为71就可以,我之前设置读取pwm也是一样的…...

phpstrom创建thinkphp项目

安装php和composer 参考 安装phpstrom 创建项目 查看thinkphp版本 https://packagist.org/packages/topthink/think 打开所在项目编辑配置 即可调试运行...

【Linux】线程同步

线程同步 一、条件变量1. 同步概念2. 条件变量概念3. 条件变量接口&#xff08;1&#xff09;pthread_cond_init()&#xff08;2&#xff09;pthread_cond_destroy()&#xff08;3&#xff09;pthread_cond_wait()&#xff08;4&#xff09;pthread_cond_signal()&#xff08;5…...

如何在多头自注意力机制的交叉学习中引入对于物理、生理、心理世界客观规律的对照验证...

要在多头自注意力机制的交叉学习中引入对于物理世界客观规律的对照验证&#xff0c;可以考虑以下方法&#xff1a; 1、引入物理模型 首先&#xff0c;建立一个物理模型&#xff0c;该模型能够描述物理世界中的客观规律。这个模型可以是已知的科学理论&#xff0c;也可以是通过实…...

智慧公厕:让智慧城市的公共厕所焕发“智慧活力”

智慧城市的建设已经进入了一个新的阶段&#xff0c;不仅仅是智慧交通、智慧环保&#xff0c;如今甚至连公厕都开始迎来智慧化时代。智慧公厕作为智慧城市的神经末梢&#xff0c;正在通过信息化、数字化和智慧化的方式&#xff0c;实现全方位的精细化管理。本文以智慧公厕源头专…...

vue导出word文档(图文示例)

第076个 查看专栏目录: VUE 本文章目录 示例说明示例效果图导出的文件效果截图示例源代码参数说明&#xff1a;重要提示&#xff1a;API 参考网址 示例说明 在Vue中导出Word文档&#xff0c;可以使用第三方库file-saver和html-docx-js。首先需要安装这两个库&#xff1a; npm …...

【C Primer Plus第六版 学习笔记】 第十七章 高级数据表示

有基础&#xff0c;进阶用&#xff0c;个人查漏补缺 链表&#xff1a;假设要编写一个程序&#xff0c;让用户输入一年内看过的所有电影&#xff0c;要储存每部影片的片名和评级。 #include <stdio.h> #include <stdlib.h> /* 提供malloc()的原型 */ #include <s…...

租用一个服务器需要多少钱?2024阿里云新版报价

2024年最新阿里云服务器租用费用优惠价格表&#xff0c;轻量2核2G3M带宽轻量服务器一年61元&#xff0c;折合5元1个月&#xff0c;新老用户同享99元一年服务器&#xff0c;2核4G5M服务器ECS优惠价199元一年&#xff0c;2核4G4M轻量服务器165元一年&#xff0c;2核4G服务器30元3…...

python-产品篇-游戏-成语填填乐

文章目录 准备代码效果 准备 无需其他文件&#xff0c;复制即用 代码 import random list["春暖花开","十字路口","千军万马","白手起家","张灯结彩","风和日丽","万里长城","人来人往",&…...

数据库数据加密的 4 种常见思路的对比

应用层加解密方案数据库前置处理方案磁盘存取环节&#xff1a;透明数据加密DB 后置处理 最近由于工作需要&#xff0c;我对欧洲的通用数据保护条例做了调研和学习&#xff0c;其中有非常重要的一点&#xff0c;也是常识性的一条&#xff0c;就是需要对用户的个人隐私数据做好加…...

HCIA-HarmonyOS设备开发认证V2.0-IOT硬件子系统-PWM

目录 一、PWM 概述二、PWM 模块相关API三、接口调用实例四、PWM HDF驱动开发4.1、开发步骤(待续...) 坚持就有收获 一、PWM 概述 PWM&#xff08;Pulse Width Modulation&#xff09;又叫脉冲宽度调制&#xff0c;它是通过对一系列脉冲的宽度进行调制&#xff0c;等效出所需要…...

001kafka源码项目gradle报错UnsupportedClassVersionError-kafka-报错-大数据学习

1 报错提示 java.lang.UnsupportedClassVersionError: org/eclipse/jgit/lib/AnyObjectId has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0 如…...

单片机学习笔记---直流电机驱动(PWM)

直流电机介绍 直流电机是一种将电能转换为机械能的装置。一般的直流电机有两个电极&#xff0c;当电极正接时&#xff0c;电机正转&#xff0c;当电极反接时&#xff0c;电机反转 直流电机主要由永磁体&#xff08;定子&#xff09;、线圈&#xff08;转子&#xff09;和换向器…...

Scrum敏捷培训机构推荐

敏捷培训机构中&#xff0c;Scrum中文网&#xff08;www.scrum.cn&#xff09;是一个值得考虑的选择。 Scrum中文网(Scrum.CN)是全球第一个Scrum中文网站&#xff0c;是中国最早的Scrum和敏捷的布道者、教育及推广机构&#xff0c;也是国际Scrum联盟&#xff08;Scrum Allianc…...

《Go 简易速速上手小册》第5章:并发编程(2024 最新版)

文章目录 5.1 Goroutines 的基础 - Go 语言中的轻盈舞者5.1.1 基础知识讲解5.1.2 重点案例&#xff1a;并发下载器功能描述实现代码扩展功能 5.1.3 拓展案例 1&#xff1a;网站健康检查功能描述实现代码扩展功能 5.1.4 拓展案例 2&#xff1a;并发日志处理器拓展案例 2&#xf…...

python - 模块

rootlearning ~]# cat gcdfunction.py #写一个模块&#xff0c;并调用此模块 def gcd(n1,n2): #之前用过的求最大公约数的代码gcd 1k 2while k< n1 and k<n2:if n1%k 0 and n2 % k 0:gcd kk k 1return gcd [rootlearning ~]# cat module.py #完整代码 from gc…...