47个SQL性能优化技巧,看到就是赚到

news2024/11/13 10:13:23

1、先了解MySQL的执行过程

了解了MySQL的执行过程,我们才知道如何进行sql优化。

(1)客户端发送一条查询语句到服务器;

(2)服务器先查询缓存,如果命中缓存,则立即返回存储在缓存中的数据;

(3)未命中缓存后,MySQL通过关键字将SQL语句进行解析,并生成一颗对应的解析树,MySQL解析器将使用MySQL语法进行验证和解析。例如,验证是否使用了错误的关键字,或者关键字的使用是否正确;

(4)预处理是根据一些MySQL规则检查解析树是否合理,比如检查表和列是否存在,还会解析名字和别名,然后预处理器会验证权限;

根据执行计划查询执行引擎,调用API接口调用存储引擎来查询数据;

(5)将结果返回客户端,并进行缓存;

 

2、数据库常见规范

(1)所有数据库对象名称必须使用小写字母并用下划线分割;

(1)所有数据库对象名称禁止使用mysql保留关键字;

(3)数据库对象的命名要能做到见名识意,并且最后不要超过32个字符;

(4)临时库表必须以tmp_为前缀并以日期为后缀,备份表必须以bak_为前缀并以日期(时间戳)为后缀;

(5)所有存储相同数据的列名和列类型必须一致;

3、所有表必须使用Innodb存储引擎

没有特殊要求(即Innodb无法满足的功能如:列存储,存储空间数据等)的情况下,所有表必须使用Innodb存储引擎(mysql5.5之前默认使用Myisam,5.6以后默认的为Innodb)。

Innodb 支持事务,支持行级锁,更好的恢复性,高并发下性能更好。

4、每个Innodb表必须有个主键

Innodb是一种索引组织表:数据的存储的逻辑顺序和索引的顺序是相同的。每个表都可以有多个索引,但是表的存储顺序只能有一种。

Innodb是按照主键索引的顺序来组织表的:

(1)不要使用更新频繁的列作为主键,不适用多列主键;

(2)不要使用UUID、MD5、HASH、字符串列作为主键(无法保证数据的顺序增长);

(3)主键建议使用自增ID值;

5、数据库和表的字符集统一使用UTF8

兼容性更好,统一字符集可以避免由于字符集转换产生的乱码,不同的字符集进行比较前需要进行转换会造成索引失效,如果数据库中有存储emoji表情的需要,字符集需要采用utf8mb4字符集。

6、查询SQL尽量不要使用select *,而是具体字段

select *的弊端:

(1)增加很多不必要的消耗,比如CPU、IO、内存、网络带宽;

(2)增加了使用覆盖索引的可能性;

(3)增加了回表的可能性;

(4)当表结构发生变化时,前端也需要更改;

(5)查询效率低;

7、避免在where子句中使用 or 来连接条件

(1)使用or可能会使索引失效,从而全表扫描;

(2)对于or没有索引的salary这种情况,假设它走了id的索引,但是走到salary查询条件时,它还得全表扫描;

(3)也就是说整个过程需要三步:全表扫描+索引扫描+合并。如果它一开始就走全表扫描,直接一遍扫描就搞定;

(4)虽然mysql是有优化器的,处于效率与成本考虑,遇到or条件,索引还是可能失效的;

8、尽量使用数值替代字符串类型

(1)因为引擎在处理查询和连接时会逐个比较字符串中每一个字符;

(2)而对于数字型而言只需要比较一次就够了;

(3)字符会降低查询和连接的性能,并会增加存储开销;

9、使用varchar代替char

(1)varchar变长字段按数据内容实际长度存储,存储空间小,可以节省存储空间;

(2)char按声明大小存储,不足补空格;

(3)其次对于查询来说,在一个相对较小的字段内搜索,效率更高;

10、财务、银行相关的金额字段必须使用decimal类型

  • 非精准浮点:float,double

  • 精准浮点:decimal

(1)Decimal类型为精准浮点数,在计算时不会丢失精度;

(2)占用空间由定义的宽度决定,每4个字节可以存储9位数字,并且小数点要占用一个字节;

(3)可用于存储比bigint更大的整型数据;

11、避免使用ENUM类型

(1)修改ENUM值需要使用ALTER语句;

(2)ENUM类型的ORDER BY操作效率低,需要额外操作;

(3)禁止使用数值作为ENUM的枚举值;

12、去重distinct过滤字段要少

(1)带distinct的语句占用cpu时间高于不带distinct的语句

(2)当查询很多字段时,如果使用distinct,数据库引擎就会对数据进行比较,过滤掉重复数据

(3)然而这个比较、过滤的过程会占用系统资源,如cpu时间

13、where中使用默认值代替null

(1)并不是说使用了is null或者 is not null就会不走索引了,这个跟mysql版本以及查询成本都有关;

(2)如果mysql优化器发现,走索引比不走索引成本还要高,就会放弃索引,这些条件 !=,<>,is null,is not null经常被认为让索引失效;

(3)其实是因为一般情况下,查询的成本高,优化器自动放弃索引的;

(4)如果把null值,换成默认值,很多时候让走索引成为可能,同时,表达意思也相对清晰一点;

14、避免在where子句中使用!=或<>操作符

(1)使用!=和<>很可能会让索引失效

(2)应尽量避免在where子句中使用!=或<>操作符,否则引擎将放弃使用索引而进行全表扫描

(3)实现业务优先,实在没办法,就只能使用,并不是不能使用

15、inner join 、left join、right join,优先使用inner join

三种连接如果结果相同,优先使用inner join,如果使用left join左边表尽量小。

  • inner join 内连接,只保留两张表中完全匹配的结果集;

  • left join会返回左表所有的行,即使在右表中没有匹配的记录;

  • right join会返回右表所有的行,即使在左表中没有匹配的记录;

为什么?

  • 如果inner join是等值连接,返回的行数比较少,所以性能相对会好一点;

  • 使用了左连接,左边表数据结果尽量小,条件尽量放到左边处理,意味着返回的行数可能比较少;

  • 这是mysql优化原则,就是小表驱动大表,小的数据集驱动大的数据集,从而让性能更优;

16、提高group by语句的效率

(1)反例

先分组,再过滤

select job, avg(salary) from employee 
group by job
having job ='develop' or job = 'test';

(2)正例

先过滤,后分组

select job,avg(salary) from employee 
where job ='develop' or job = 'test' 
group by job;

(3)理由

可以在执行到该语句前,把不需要的记录过滤掉

17、清空表时优先使用truncate

truncate table在功能上与不带 where子句的 delete语句相同:二者均删除表中的全部行。但 truncate table比 delete速度快,且使用的系统和事务日志资源少。

delete语句每次删除一行,并在事务日志中为所删除的每行记录一项。truncate table通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。

truncate table删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 DELETE。如果要删除表定义及其数据,请使用 drop table语句。

对于由 foreign key约束引用的表,不能使用 truncate table,而应使用不带  where子句的 DELETE 语句。由于 truncate table不记录在日志中,所以它不能激活触发器。

truncate table不能用于参与了索引视图的表。

18、操作delete或者update语句,加个limit或者循环分批次删除

(1)降低写错SQL的代价

清空表数据可不是小事情,一个手抖全没了,删库跑路?如果加limit,删错也只是丢失部分数据,可以通过binlog日志快速恢复的。

(2)SQL效率很可能更高

SQL中加了limit 1,如果第一条就命中目标return, 没有limit的话,还会继续执行扫描表。

(3)避免长事务

delete执行时,如果age加了索引,MySQL会将所有相关的行加写锁和间隙锁,所有执行相关行会被锁住,如果删除数量大,会直接影响相关业务无法使用。

(4)数据量大的话,容易把CPU打满

如果你删除数据量很大时,不加 limit限制一下记录数,容易把cpu打满,导致越删越慢。

(5)锁表

一次性删除太多数据,可能造成锁表,会有lock wait timeout exceed的错误,所以建议分批操作。

19、UNION操作符

UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION。如:

​​​​​​​

select username,tel from user
union
select departmentname from department

这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。推荐方案:采用UNION ALL操作符替代UNION,因为UNION ALL操作只是简单的将两个结果合并后就返回。

20、SQL语句中IN包含的字段不宜过多

MySQL的IN中的常量全部存储在一个数组中,这个数组是排序的。如果值过多,产生的消耗也是比较大的。如果是连续的数字,可以使用between代替,或者使用连接查询替换。

21、批量插入性能提升

(1)多条提交

INSERT INTO user (id,username) VALUES(1,'亚瑟');
INSERT INTO user (id,username) VALUES(2,'妲己');

(2)批量提交

INSERT INTO user (id,username) VALUES(1,'亚瑟'),(2,'妲己');

默认新增SQL有事务控制,导致每条都需要事务开启和事务提交,而批量处理是一次事务开启和提交,效率提升明显,达到一定量级,效果显著,平时看不出来。

22、表连接不宜太多,索引不宜太多,一般5个以内

(1)表连接不宜太多,一般5个以内

  • 关联的表个数越多,编译的时间和开销也就越大

  • 每次关联内存中都生成一个临时表

  • 应该把连接表拆开成较小的几个执行,可读性更高

  • 如果一定需要连接很多表才能得到数据,那么意味着这是个糟糕的设计了

  • 阿里规范中,建议多表联查三张表以下

(2)索引不宜太多,一般5个以内

  • 索引并不是越多越好,虽其提高了查询的效率,但却会降低插入和更新的效率;

  • 索引可以理解为一个就是一张表,其可以存储数据,其数据就要占空间;

  • 索引表的数据是排序的,排序也是要花时间的;

  • insert或update时有可能会重建索引,如果数据量巨大,重建将进行记录的重新排序,所以建索引需要慎重考虑,视具体情况来定;

  • 一个表的索引数最好不要超过5个,若太多需要考虑一些索引是否有存在的必要;

23、禁止给表中的每一列都建立单独的索引

真有这么干的,我也是醉了。

至于索引不会的同学可以看看哪吒这篇文章

2万字带你精通MySQL索引

24、如何选择索引列的顺序

建立索引的目的是:希望通过索引进行数据查找,减少随机IO,增加查询性能 ,索引能过滤出越少的数据,则从磁盘中读入的数据也就越少。

区分度最高的放在联合索引的最左侧(区分度=列中不同值的数量/列的总行数)。

尽量把字段长度小的列放在联合索引的最左侧(因为字段长度越小,一页能存储的数据量越大,IO性能也就越好)。

使用最频繁的列放到联合索引的左侧(这样可以比较少的建立一些索引)。

25、对于频繁的查询优先考虑使用覆盖索引

覆盖索引:就是包含了所有查询字段(where,select,ordery by,group by包含的字段)的索引。

覆盖索引的好处:

(1)避免Innodb表进行索引的二次查询

Innodb是以聚集索引的顺序来存储的,对于Innodb来说,二级索引在叶子节点中所保存的是行的主键信息,如果是用二级索引查询数据的话,在查找到相应的键值后,还要通过主键进行二次查询才能获取我们真实所需要的数据。

而在覆盖索引中,二级索引的键值中可以获取所有的数据,避免了对主键的二次查询 ,减少了IO操作,提升了查询效率。

(2)可以把随机IO变成顺序IO加快查询效率

由于覆盖索引是按键值的顺序存储的,对于IO密集型的范围查找来说,对比随机从磁盘读取每一行的数据IO要少的多,因此利用覆盖索引在访问时也可以把磁盘的随机读取的IO转变成索引查找的顺序IO。

26、建议使用预编译语句进行数据库操作

预编译语句可以重复使用这些计划,减少SQL编译所需要的时间,还可以解决动态SQL所带来的SQL注入的问题。

只传参数,比传递SQL语句更高效。

相同语句可以一次解析,多次使用,提高处理效率。

27、避免产生大事务操作

大批量修改数据,一定是在一个事务中进行的,这就会造成表中大批量数据进行锁定,从而导致大量的阻塞,阻塞会对MySQL的性能产生非常大的影响。

特别是长时间的阻塞会占满所有数据库的可用连接,这会使生产环境中的其他应用无法连接到数据库,因此一定要注意大批量写操作要进行分批。

28、避免在索引列上使用内置函数

使用索引列上内置函数,索引失效。

29、组合索引

排序时应按照组合索引中各列的顺序进行排序,即使索引中只有一个列是要排序的,否则排序性能会比较差。

create index IDX_USERNAME_TEL on user(deptid,position,createtime);
select username,tel from user where deptid= 1 and position = 'java开发' order by deptid,position,createtime desc;

实际上只是查询出符合 deptid= 1 and position = 'java开发'条件的记录并按createtime降序排序,但写成order by createtime desc性能较差。

30、复合索引最左特性

(1)创建复合索引

ALTER TABLE employee ADD INDEX idx_name_salary (name,salary)

(2)满足复合索引的最左特性,哪怕只是部分,复合索引生效

SELECT * FROM employee WHERE NAME='萧炎'

(3)没有出现左边的字段,则不满足最左特性,索引失效

SELECT * FROM employee WHERE salary=5000

(4)复合索引全使用,按左侧顺序出现 name,salary,索引生效

SELECT * FROM employee WHERE NAME='萧炎' AND salary=5000

(5)虽然违背了最左特性,但MySQL执行SQL时会进行优化,底层进行颠倒优化

SELECT * FROM employee WHERE salary=5000 AND NAME='萧炎'

(6)理由

复合索引也称为联合索引,当我们创建一个联合索引的时候,如(k1,k2,k3),相当于创建了(k1)、(k1,k2)和(k1,k2,k3)三个索引,这就是最左匹配原则。

联合索引不满足最左原则,索引一般会失效。

31、必要时可以使用force index来强制查询走某个索引

有的时候MySQL优化器采取它认为合适的索引来检索SQL语句,但是可能它所采用的索引并不是我们想要的。这时就可以采用forceindex来强制优化器使用我们制定的索引。

32、优化like语句

模糊查询,程序员最喜欢的就是使用like,但是like很可能让你的索引失效。

  • 首先尽量避免模糊查询,如果必须使用,不采用全模糊查询,也应尽量采用右模糊查询, 即like ‘…%’,是会使用索引的;

  • 左模糊like ‘%...’无法直接使用索引,但可以利用reverse + function index的形式,变化成 like ‘…%’;

  • 全模糊查询是无法优化的,一定要使用的话建议使用搜索引擎。

33、统一SQL语句的写法

对于以下两句SQL语句, 程序员认为是相同的,数据库查询优化器认为是不同的。

select * from user;
select * From USER;

这都是很常见的写法,也很少有人会注意,就是表名大小写不一样而已。然而,查询解析器认为这是两个不同的SQL语句,要解析两次,生成两个不同的执行计划,作为一名严谨的Java开发工程师,应该保证两个一样的SQL语句,不管在任何地方都是一样的。

34、不要把SQL语句写得太复杂

经常听到有人吹牛逼,我写了一个800行的SQL语句,逻辑感超强,我们还开会进行了SQL讲解,大家都投来了崇拜的目光……其实越多行说明这个SQL写的越烂......

一般来说,嵌套子查询、或者是3张表关联查询还是比较常见的,但是,如果超过3层嵌套的话,查询优化器很容易给出错误的执行计划,影响SQL效率。SQL执行计划是可以被重用的,SQL越简单,被重用的概率越大,生成执行计划也是很耗时的。

35、将大的DELETE,UPDATE、INSERT 查询变成多个小查询

能写一个几十行、几百行的SQL语句是不是显得逼格很高?然而,为了达到更好的性能以及更好的数据控制,你可以将他们变成多个小查询。

36、关于临时表

(1)避免频繁创建和删除临时表,以减少系统表资源的消耗;

(2)在新建临时表时,如果一次性插入数据量很大,那么可以使用 select into 代替 create table,避免造成大量 log;

(3)如果数据量不大,为了缓和系统表的资源,应先create table,然后insert;

(4)如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除。先 truncate table ,然后 drop table ,这样可以避免系统表的较长时间锁定。

37、使用explain分析你SQL执行计划

(1)type

  • system:表仅有一行,基本用不到;

  • const:表最多一行数据配合,主键查询时触发较多;

  • eq_ref:对于每个来自于前面的表的行组合,从该表中读取一行。这可能是最好的联接类型,除了const类型;

  • ref:对于每个来自于前面的表的行组合,所有有匹配索引值的行将从这张表中读取;

  • range:只检索给定范围的行,使用一个索引来选择行。当使用=、<>、>、>=、<、<=、IS NULL、<=>、BETWEEN或者IN操作符,用常量比较关键字列时,可以使用range;

  • index:该联接类型与ALL相同,除了只有索引树被扫描。这通常比ALL快,因为索引文件通常比数据文件小;

  • all:全表扫描;

  • 性能排名:system > const > eq_ref > ref > range > index > all。

  • 实际sql优化中,最后达到ref或range级别。

(2)Extra常用关键字

  • Using index:只从索引树中获取信息,而不需要回表查询;

  • Using where:WHERE子句用于限制哪一个行匹配下一个表或发送到客户。除非你专门从表中索取或检查所有行,如果Extra值不为Using where并且表联接类型为ALL或index,查询可能会有一些错误。需要回表查询。

  • Using temporary:mysql常建一个临时表来容纳结果,典型情况如查询包含可以按不同情况列出列的GROUP BY和ORDER BY子句时;

38、读写分离与分库分表

当数据量达到一定的数量之后,限制数据库存储性能的就不再是数据库层面的优化就能够解决的;这个时候往往采用的是读写分离与分库分表同时也会结合缓存一起使用,而这个时候数据库层面的优化只是基础。

读写分离适用于较小一些的数据量;分表适用于中等数据量;而分库与分表一般是结合着用,这就适用于大数据量的存储了,这也是现在大型互联网公司解决数据存储的方法之一。

39、使用合理的分页方式以提高分页的效率

select id,name from user limit 100000, 20

使用上述SQL语句做分页的时候,随着表数据量的增加,直接使用limit语句会越来越慢。

此时,可以通过取前一页的最大ID,以此为起点,再进行limit操作,效率提升显著。

select id,name from user where id> 100000 limit 20

40、尽量控制单表数据量的大小,建议控制在500万以内

500万并不是MySQL数据库的限制,过大会造成修改表结构,备份,恢复都会有很大的问题。

可以用历史数据归档(应用于日志数据),分库分表(应用于业务数据)等手段来控制数据量大小。

41、谨慎使用Mysql分区表

(1)分区表在物理上表现为多个文件,在逻辑上表现为一个表;

(2)谨慎选择分区键,跨分区查询效率可能更低;

(3)建议采用物理分表的方式管理大数据。

42、尽量做到冷热数据分离,减小表的宽度

Mysql限制每个表最多存储4096列,并且每一行数据的大小不能超过65535字节。

减少磁盘IO,保证热数据的内存缓存命中率(表越宽,把表装载进内存缓冲池时所占用的内存也就越大,也会消耗更多的IO);

更有效的利用缓存,避免读入无用的冷数据;

经常一起使用的列放到一个表中(避免更多的关联操作)。

43、禁止在表中建立预留字段

(1)预留字段的命名很难做到见名识义;

(2)预留字段无法确认存储的数据类型,所以无法选择合适的类型;

(3)对预留字段类型的修改,会对表进行锁定;

44、禁止在数据库中存储图片,文件等大的二进制数据

通常文件很大,会短时间内造成数据量快速增长,数据库进行数据库读取时,通常会进行大量的随机IO操作,文件很大时,IO操作很耗时。

通常存储于文件服务器,数据库只存储文件地址信息。

45、建议把BLOB或是TEXT列分离到单独的扩展表中

Mysql内存临时表不支持TEXT、BLOB这样的大数据类型,如果查询中包含这样的数据,在排序等操作时,就不能使用内存临时表,必须使用磁盘临时表进行。而且对于这种数据,Mysql还是要进行二次查询,会使sql性能变得很差,但是不是说一定不能使用这样的数据类型。

如果一定要使用,建议把BLOB或是TEXT列分离到单独的扩展表中,查询时一定不要使用select * 而只需要取出必要的列,不需要TEXT列的数据时不要对该列进行查询。

46、TEXT或BLOB类型只能使用前缀索引

因为MySQL对索引字段长度是有限制的,所以TEXT类型只能使用前缀索引,并且TEXT列上是不能有默认值的。

MySql基础知识总结(SQL优化篇)

47、一些其它优化方式

(1)当只需要一条数据的时候,使用limit 1

limit 1可以避免全表扫描,找到对应结果就不会再继续扫描了。

(2)如果排序字段没有用到索引,就尽量少排序

(3)所有表和字段都需要添加注释

使用comment从句添加表和列的备注,从一开始就进行数据字典的维护。

(4)SQL书写格式,关键字大小保持一致,使用缩进。

(5)修改或删除重要数据前,要先备份。

(6)很多时候用 exists 代替 in 是一个好的选择

(7)where后面的字段,留意其数据类型的隐式转换。

(8)尽量把所有列定义为NOT NULL

NOT NULL列更节省空间,NULL列需要一个额外字节作为判断是否为 NULL的标志位。NULL列需要注意空指针问题,NULL列在计算和比较的时候,需要注意空指针问题。

(9)伪删除设计

(10)索引不适合建在有大量重复数据的字段上,比如性别,排序字段应创建索引

(11)尽量避免使用游标

因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写。

 

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

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

相关文章

Linux 内核 container_of 宏详解

目录 前言 1、container_of 宏介绍 2、container_of 宏的使用示例 3、container_of 宏实现原理分析 3.1 结构体在内存中的存储 3.2 计算成员变量在结构体内的偏移 3.3 container_of 宏的原理实现 4、总结 前言 本章内容会涉及到的基础知识有 typeof关键字 和 语句表达…

django-博客(一)

一、 1、环境&#xff1a;pycharm&#xff0c;python3.6&#xff0c;django3&#xff0c;mysql8.0 2、创建项目 3、把html和css样式那些导入到文件夹中&#xff0c;​​​​​​然后配置这些文件夹的路径&#xff0c;再添加首页视图。 改成反向解析 python manage.py runserv…

ElasticSearch 学习笔记总结(三)

文章目录一、ES 相关名词 专业介绍二、ES 系统架构三、ES 创建分片副本 和 elasticsearch-head插件四、ES 故障转移五、ES 应对故障六、ES 路由计算 和 分片控制七、ES集群 数据写流程八、ES集群 数据读流程九、ES集群 更新流程 和 批量操作十、ES 相关重要 概念 和 名词十一、…

熵,线性规划,半监督自监督聚类打标签

1.熵 信息熵是消除不确定性所需信息量的度量。 信息熵就是信息的不确定程度&#xff0c;信息熵越小&#xff0c;信息越确定。 对象的信息熵是正比于它的概率的负对数的&#xff0c;也就是 I©−log(pc) 其中n为事件的所有可能性。 为什么使用交叉熵&#xff1f;在机器学习…

分析设备故障时间和次数,打破生产瓶颈?包在虹科身上

前言 生产设备的稳定性和可靠性是保证企业正常生产的重要条件之一&#xff0c;设备故障的频发严重影响企业的正常生产&#xff0c;那么如何分析设备故障时间和次数&#xff0c;查找设备故障原因&#xff0c;协助企业打破生产瓶颈&#xff0c;有效地实现生产目标呢&#xff1f;…

面试总结——react生命周期

react生命周期总结 生命周期主要分为以下几个阶段&#xff1a; Mounting:创建虚拟DOM&#xff0c;渲染UI(初始化)Updating&#xff1a;更新虚拟DOM&#xff0c;重新渲染UI&#xff1b;(更新)UnMounting&#xff1a;删除虚拟DOM&#xff0c;移除UI&#xff1b;(销毁) 生命周期…

docker-compose安装kafka和php简单测试

docker-compose.yml内容&#xff1a; version: 3.1 services: zookeeper: container_name: zookeeper image: zookeeper:3.6 ports: - 2181:2181 kafka: image: wurstmeister/kafka container_name: kafka depends_on: - zookeeper …

java基础系列(八) synchronized关键字

一. 认识synchronized 先看一下如下Demo public class Test {public static void main(String[] args) {Count obj new Count();//only one objectMyThread1 t1 new MyThread1(obj);MyThread2 t2 new MyThread2(obj);t1.start();t2.start();} }class MyThread2 extends Th…

面试题1-JAVA的执行流程

JAVA的执行流程 分两步,1.翻译 2执行 Java属于两种类型: 编译型和解释型 编译型 ​ 概念: 把源代码翻译成.class文件 >意思是: 把程序员的源代码翻译成虚拟电脑能看得懂的代码 解释型 ​ 概念: 把.class文件进行解析执行 >把翻译后的代码交给虚拟电脑执行指令 执行流程…

揭开Salesforce Accredited Professional证书神秘面纱,到底含金量有多高?

自从Salesforce宣布Accredited Professional计划以来&#xff0c;已经过去了将近两年。这些认证旨在证明备考者在Salesforce平台特定领域的广泛知识&#xff0c;并且仅供Salesforce合作伙伴使用。Accredited Professional中有近40项Salesforce认证&#xff0c;涵盖平台、销售、…

学校机房4大安全隐患,赶紧自查

无论是企业、医院、政府机构还是学校&#xff0c;都有机房。传统机房出现事故时无法及时发现和处理&#xff0c;导致影响范围大&#xff0c;损失严重。 随着信息技术的不断发展&#xff0c;各行业信息化程度不断提升&#xff0c;配套的数据中心机房日益增多&#xff0c;为业务信…

LeetCode 147. 对链表进行插入排序 | C/C++版

LeetCode 147. 对链表进行插入排序 | C语言版LeetCode 147. 对链表进行插入排序题目描述解题思路思路一&#xff1a;使用栈代码实现运行结果参考文章&#xff1a;思路二&#xff1a;减少遍历节点数代码实现运行结果参考文章&#xff1a;[]()LeetCode 147. 对链表进行插入排序 …

Sharding Sphere学习

一、基本概念 1.什么是Sharding Sphere 2.分库分表3.分库分表的方式 4.分库分表应用和问题 5.功能 5.1数据分片 —核心概念 —使用限制 5.2分布式事务 —核心概念 —使用限制 5.3读写分离 —核心概念 —使用限制 5.4高可用 —核心概念 —使用限制 5.5数据库网关 —核心概念…

shield分析

本文仅供学习交流&#xff0c;只提供关键思路不会给出完整代码&#xff0c;严禁用于非法用途&#xff0c;若有侵权请联系我删除&#xff01;技术交流合作请私信&#xff01; 熟练打开Fiddler设置好手机代理&#xff0c;摆弄半天一直抓不到包&#xff0c;应该是小红书监测到了F…

对 Dom 树的理解

什么是 DOM 从网络传给渲染引擎的 HTML 文件字节流是无法直接被渲染引擎理解的&#xff0c;所以要将其转化为渲染引擎能够理解的内部结构&#xff0c;这个结构就是 DOM。 DOM 提供了对 HTML 文档结构化的表述。 在渲染引擎中&#xff0c;DOM 有三个层面的作用&#xff1a; …

攻略 | 6步帮助中小微企业开拓东盟机电产品市场

如何帮助中小微外贸企业在东盟市场拓展机电产品一般贸易&#xff1f;随着全球化的发展&#xff0c;越来越多的中小微外贸企业开始涉足国际贸易。对于机电产品行业而言&#xff0c;东盟市场是一个非常重要的出口目的地。本文将为您介绍如何帮助中小微外贸企业在东盟市场拓展机电…

用一个例子告诉你 怎样使用Spark中RDD的算子

目录 1. 前言 1.1 操作分类 1.2 语法知识 2. transformations 2.1 map 2.2 mapPartitions 2.3 flatMap 2.4 glom 2.5 groupBy 2.6 filter 2.7 sample 2.8 distinct 2.9 coalesce 2.10 repartition 2.11 sortBy 2.12 partitionBy 2.13 reduceByKey 2.14 gro…

从软件的角度看待PCI和PCIE(一)

1.最容易访问的设备是什么&#xff1f; 是内存&#xff01; 要读写内存&#xff0c;知道它的地址就可以了&#xff0c;不需要什么驱动程序&#xff1b; volatile unsigned int *p 0xffff8811; unsigned int val; *p val; val *p;只有内存能这样简单、方便的使用吗&#xf…

python中的序列——笔记

一、介绍 ABC语言时一个致力于为初学者设计编程环境的长达十年的研究项目。 Python也从ABC那里继承了用统一的风格去处理序列数据这一特点。不管是哪种数据结构&#xff0c;字符串、列表、字节序列、数组、XML元素&#xff0c;抑或是数据库查询结果&#xff0c;它们都共用一套…

SD卡损坏了?储存卡恢复数据就靠这3个方法

作为一种方便的储存设备&#xff0c;SD卡在我们的日常生活中使用非常广泛。但是&#xff0c;有时候我们可能会遇到SD卡损坏的情况&#xff0c;这时候里面存储的数据就会受到影响。SD卡里面保存着我们很多重要的数据&#xff0c;有些还是工作必须要使用的。 如果您遇到了这种情…