不喜勿喷!MySQL调优实战经验总结,扫平你的数据库开发障碍

  • 常见的 my.cnf 文件类型

my-small.cnf my-medium.cnf my-large.cnfmy-huge.cnf

MySQL 的版本选择

  • 5.6 更成熟、更稳定,缺乏一些5.7开始支持的新特性。

  • 5.7 支持更多新特性,支持 MGR、JSON 字段格式等。从 5.7 开始,MySQL 对 SQL 语法的检查变为严格,之前一些存在潜在问题和错误的 SQL 会无法执行。

  • 8.0 拥有很多新的功能,包括 SQL 方面、JSON 方面以及 DevOps 方面,据说性能提升长达 15 倍。

MySQL 之外的选择

  • Oracle: 免费下载,但是商业用途收费(按 CPU 收费),功能和稳定性更佳,免费和收费的培训资料很多。由于 Oracle 的系统架构较老,代码难以进行整体颠覆性的修改,所以只能在每个版本中进行较小的改进。

  • PostgreSQL:(国内有依托阿里德哥推广的强大知识分享社区) 和 MySQL 一样,社区版代码开源,SQL 风格和 Oracle 更加接近,功能和性能也比 MySQL 更加强大,支持 MPP(Greenplum)、LLVM、GIS、列式存储、图计算等特性。普及率相对较低,文档和资料比 Oracle、MySQL 要少。

MySQL 引擎选择和表设计上的优化

==================

不喜勿喷!MySQL调优实战经验总结,扫平你的数据库开发障碍

大多 Web 工程师,使用更多的引擎选择和表设计,并且随着业务量发展,会进行不同类型或程度上的优化。5.7 之后默认存储引擎为 InnoDB,主要 InnoDB 能应用绝大数场景。

Myisam 和 InnoDB 的区别?

其实关于这两个最常用的存储引擎,无非就是看场景,其实没有绝对的好与坏,不要教条主义,适合自己业务的就是最好的。

  • Myisam:表级锁,不支持事务,读性能更好,读写分离中做读(从)节点。老版本 MySQL 的默认存储引擎。表的存储分为三个文件:frm表格式,MYD/MYData 数据文件,myi 索引文件。

  • InnoDB:有条件的行级锁,支持事务,更适合作为读写分离中的写(主)节点。新版本 MySQL(5.7开始)的默认存储引擎。

其他的引擎介绍

  • XtraDB:XtraDB 是一个 MySQL 的存储引擎,由 Percona 公司对于 InnoDB 存储引擎进行改进加强后的产品,其设计的主要目的是用以替代现在的 InnoDB。XtraDB 兼容 InnoDB 的所有特性,并且在 IO 性能,锁性能,内存管理等多个方面进行了增强。

  • TokuDB:TokuDB 是一个高性能、支持事务处理的 MySQL 和 MariaDB 的存储引擎。TokuDB 的主要特点则是对高写压力的支持。

MySQL SQL 语句的优化

===============

不喜勿喷!MySQL调优实战经验总结,扫平你的数据库开发障碍

关于 SQL 优化,对于基本大多的 Web 研发人员,注意一个核心点:减少 IO 请求,网络传输。

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

2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描。如:

select id from t where ais null

可以在 a 上设置默认值 0,确保表中 a 列没有 null 值,然后这样查询:

select id from t where a=0

3.尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:

select id from t where a=10 or a=20

可以这样查询:

select id from t where a=10union allselect id from t where a=20

4.下面的查询也将导致全表扫描:

select id from t where name like‘%c%’

下面走索引

select id from t where name like‘c%’

若要提高效率,可以考虑全文检索。

5.in 和 not in 也要慎用,否则会导致全表扫描,如:

select id from t where a in(1,2,3)

对于连续的数值,能用 between 就不要用 in 了:

select id from t where a between 1 and 3

如果在 where 子句中使用参数,也会导致全表扫描。因为 SQL 只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:

select id from t where a=@a

可以改为强制查询使用索引:

select id from t with(index(索引名)) where a=@a

6.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:

select id from t where a/2=100

应改为:

select id from t where a=100*2

7.应尽量避免在 where 子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:

select id from t where substring(name,1,3)=‘abc’ name以abc开头的id

select id from t where datediff(day,createdate,‘2005-11-30’)= 0 '2005-11-30’生成的id

应改为:

select id from t where name like‘abc%’

select id from t where createdate>='2005-11-30′ and createdate<'2005-12-1′

8.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

9.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。

10.很多时候用 exists 代替 in 是一个好的选择:

select num from a where num in (select num from b)

用下面的语句替换:

select num from a where exists (select 1 from b where num=a.num)

11.并不是所有索引对查询都有效,SQL 是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL 查询可能不会去利用索引,如果表中有字段 sex,male、female 几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。

12.索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有 必要。

13.应尽可能的避免更新 clustered 索引数据列,因为 clustered 索引数据列的顺序就是表记录的物理存储顺序,一旦该列值改变将导致整个表记录的顺序的调整,会耗费相当大的资源。若应用系统需要频繁更新 clustered 索引数据列,那么需要考虑是否应将该索引建为 clustered 索引。

14.尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会 逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。

15.尽可能的使用 varchar 代替 char,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。

16.任何地方都不要使用 select * from t ,用具体的字段列表代替 *,不要返回用不到的任何字段。这里就是典型的减少网络传输,尤其大多数业务中,用户优惠券列表,如果全是*,如果用户数据过多,程序在网络传输过程中会超时。

17.尽量使用表变量来代替临时表。如果表变量包含大量数据,请注意索引非常有限(只有主键索引)。

18.避免频繁创建和删除临时表,以减少系统表资源的消耗。

19.临时表并不是不可使用,适当地使用它们可以使某些例程更有效,例如,当需要重复引用大型表或常用表中的某个数据集时。但是,对于一次性事件,最好使 用导出表。

20.在新建临时表时,如果一次性插入数据量很大,那么可以使用 select into 代替 create table,避免造成大量 log,以提高速度;如果数据量不大,为了缓和系统表的资源,应先create table,然后insert。

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

22.当只要一行数据时使用 Limit 1。当查询表已经知道结果只会有一条结果,在这种情况下,加上 Limit 1 可以增加性能。MySQ L数据库引擎会在找到一条数据后停止搜索,而不是继续往后查找下一条符合记录的数据。

23.如果应用程序有很多 Join 查询,应该确认两个表中 Join 的字段是被建过索引的。这样,MySQL 内部会启动优化 Join 的 SQL 语句的机制。这些被用来 Join 的字段,应该是相同的类型的。例如:如果要把 DECIMAL 字段和一个 INT 字段 Join 在一起,MySQL 就无法使用它们的索引。对于那些 STRING 类型,还需要有相同的字符集才行。

24.固定长度的表会更快,如果表中的所有字段都是 “固定长度” 的,整个表会被认为是 static 或 fixed-length。例如,表中没有如下类型的字段: VARCHAR,TEXT,BLOB。只要你包括了其中一个这些字段,那么这个表就不是 “固定长度静态表” 了,这样,MySQL 引擎会用另一种方法来处理。固定长度的表会提高性能,因为 MySQL 搜寻得会更快一些,因为这些固定的长度是很容易计算下一个数据的偏移量的,所以读取的自然也会很快。而如果字段不是定长的,那么,每一次要找下一条的话,需要程序找到主键。并且,固定长度的表也更容易被缓存和重建。不过,唯一的副作用是,固定长度的字段会浪费一些空间,因为定长的字段无论你用不用,他都是要分配那么多的空间。

25.尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。

26.尽量避免大事务操作,提高系统并发能力。

27.不同数据库的 SQL 执行顺序的差别。

28.MySQL Explain 执行计划 type 类型区别:

性能从好到差:system,const,eq_ref,ref,fulltext,ref_or_null,unique_subquery,index_subquery,range,index_merge,index,all。

除了 all 之外,其他的 type 都可以使用到索引,除了 index_merge 之外,其他的 type 只可以用到一个索引。

  • system:表中只有一行数据或者是空表,且只能用于 myisam 和 memory 表。如果是 InnoDB 引擎表,type 列在这个情况通常都是 all 或者 index

  • const:使用唯一索引或者主键,返回记录一定是 1 行记录的等值 where 条件时,通常 type 是 const。也叫做唯一索引扫描。

  • eq_ref:出现在要连接多个表的查询计划中,驱动表只返回一行数据,且这行数据是第二个表的主键或者唯一索引,且必须为 not null,唯一索引和主键是多列时,只有所有的列都用作比较时才会出现 eq_ref。

  • ref:不像 eq_ref 那样要求连接顺序,也没有主键和唯一索引的要求,只要使用相等条件检索时就可能出现。常见与辅助索引的等值查找,或者多列主键、唯一索引中,使用第一个列之外的列作为等值查找也会出现,总之,返回数据不唯一的等值查找就可能出现。

  • fulltext:全文索引检索,要注意,全文索引的优先级很高,若全文索引和普通索引同时存在时,MySQL不管代价,优先选择使用全文索引。

  • ref_or_null:与 ref 方法类似,只是增加了 null 值的比较。实际用的不多。

  • unique_subquery:用于 where 中的 in 形式子查询,子查询返回不重复值唯一值
    自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结

面试建议是,一定要自信,敢于表达,面试的时候我们对知识的掌握有时候很难面面俱到,把自己的思路说出来,而不是直接告诉面试官自己不懂,这也是可以加分的。

以上就是蚂蚁技术四面和HR面试题目,以下最新总结的最全,范围包含最全MySQL、Spring、Redis、JVM等最全面试题和答案,仅用于参考

一份还热乎的蚂蚁金服面经(已拿Offer)面试流程4轮技术面+1轮HR

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
/img-community.csdnimg.cn/images/e5c14a7895254671a72faed303032d36.jpg" alt=“img” style=“zoom: 33%;” />

总结

面试建议是,一定要自信,敢于表达,面试的时候我们对知识的掌握有时候很难面面俱到,把自己的思路说出来,而不是直接告诉面试官自己不懂,这也是可以加分的。

以上就是蚂蚁技术四面和HR面试题目,以下最新总结的最全,范围包含最全MySQL、Spring、Redis、JVM等最全面试题和答案,仅用于参考

[外链图片转存中…(img-aSP19Et0-1712269421466)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

  • 21
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值