MySQL调优

可以从多个方面讲,最好不要只讲索引和SQL语句(但这些也是必须要讲的),还可以补充一些架构、硬件方面(加分项)

架构

读写分离:读写分离能有效提高查询性能。主从同步用到bin log和relay log。

主从

分库分表:据量级到达千万级以上后,垂直拆分(分库)、水平拆分(分表)、垂直+水平拆分(分库分表)。

缓存Redis:为热点数据加缓存,提高检索性能

java数据结构

硬件

内存,CPU,磁盘上的升级,主要是运维方面操控

MySQL版本

MySQL连接数

SQL优化和索引

这也是最主要,我们后台开发人员能做的。

核心思想:减少数据扫描,返回更少数据,减少交互次数,减少服务器CPU和内存开销

执行步骤

1.排查慢SQL

使用慢查询日志和慢查询工具,看哪些SQL运行的最慢

2.执行计划分析

explan分析sql执行计划(访问类型、记录条数、索引长度等)

主要关注字段:

possible_keys:查询可能用到的索引
key:实际使用的索引
key_len:实际使用的索引的字节数长度。
type:访问类型,看有没有走索引。all(全表扫描),ref(命中非唯一索引),const(命中主键/唯一索引)、range(范围索引查询)、index_merge(使用多个索引)、 system(一行记录时,快速查询)。
Extra:额外信息。看有没有走索引。
using index:覆盖索引,不回表。
using filesort:需要额外的排序。排序分为索引排序和filesort排序,索引排序一般更快,深分页等查询数据量大时filesort更快。
using index condition:索引下推。MySQL5.6开始支持。联合索引某字段是模糊查询(非左模糊)时,该字段进行条件判断后,后面几个字段可以直接条件判断,判断过滤后再回表对不包含在联合索引内的字段条件进行判断。
using where:不走索引,全表扫描。

根据这些字段信息进行优化调整,比如对表设计的优化,SQL语句的优化和索引方面的优化。

SQL语句优化

1.合理选用EXISTS 和 IN :

遵循小表驱动大表原则,左边表小就是EXISTS,左边表大就用IN。

2.尽量COUNT(1)或COUNT(*):

innoDB时,COUNT(1),COUNT(*)时,查询优化器会优先选用有索引的、占用空间最小的二级索引树进行统计,只有找不到非聚簇索引树时采用使用聚簇索引树统计,空间占用大。当然也能COUNT(最小空间二级索引字段),但麻烦不如交给优化器自动选择。MyISAM时,就无所谓了,用哪个时间复杂度都是O(1)。

3.尽量SELECT(明确字段):

建议明确字段,查询优化器解析“*”符号为所有列名耗费时间,并且“*”号无法使用覆盖索引。

4.全表扫描时尽量用“LIMIT”:

当全表扫描时,并且你知道结果集记录数量时,用limit限制,这样扫描足够数量后就停止,不再扫描完全表了。如果有索引,就无需用limit了。

使用limit N,少用limit M,N:

特别是大表或M比较大的时候。

5.将长事务拆为多个小事务:

尽量多使用 COMMIT,用编程式事务而不是声明式事务,降低事务粒度。提交事务可以释放的资源:回滚段上用于恢复数据的信息、锁、redo / undo log buffer 中的空间。

6.先查再删改:

UPDATE、DELETE语句一定要有明确的WHERE条件。

7.尽量UNION ALL而不是UNION:

UNION A LL不去重,速度更快

索引优化

SQL查询最好要基于索引进行,避免发生索引失效的现象(MySQL索引篇里面的索引失效场景)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值