今日复习:
- mysql存储过程的优劣势
- mysql性能优化
- 连接层优化怎么配置连接数
- 表的结构优化
- 参数优化
- 架构优化
- sql优化
- sql的执行标准
- 慢查询语句,如何进行排查
- 客户端连接异常是什么原因造成的
- mysql的死锁
- 服务器cpu占用为100%怎么排查
- mysql磁盘利用率为100%怎么排查
- 存储过程的好处是,存储过程可以被反复的调用,存储过程可以用变量、流程控制语句,可以完成复杂的sql查询,调用存储过程只需要传输调用语句和参数,不需要传输一条体积较大的sql语句,执行多次后会被编译成机器码驻留在线程缓冲区,后续执行无需编译,减小sql暴露的风险。缺点是开销较大,cpu计算开销和内存的占用率较高,维护性较差,不支持调试。
- 性能优化可以从5个维度进行分析:
- 连接层优化:调整客户端的db连接池的参数和db连接层的参数
- 结构的优化:合理的设计库表结构,表中字段根据业务选择合适的数据类型和索引
- 参数/配置的优化:调整参数的默认值,根据业务将参数调整到合适的大小
- 架构优化:引入中间件减轻数据库压力,优化mysql架构提高可用性
- 编码优化:根据库表结构,索引结构优化业务sql语句,提高索引命中率
- cpu核心数*2,如果硬盘的材质是ssd的,那么可以加一
- 表结构优化:选择合适的存储引擎,精细化字段数量,选择合适的主键,适当冗余字段和中间表。字段结构优化:在保证足够使用的范围内,选择最小的数据类型,如能用int就别用bigint,尽量避免索引字段值为null,因为字段空值过多会影响索引性能。在条件允许的情况下,尽量使用最简单的类型代替复杂的类型。索引结构优化:尽量避免创建过多的单列索引,对于多个字段要用索引,可以用联合索引代替。对于一个值较长字段创建索引,可以使用前N个字节,创建前缀索引。索引类型一定要选择合理,如经常做模糊查询字段,可用全文索引代替普通索引。某个字段在业务中无需用作范围查询,可以通过hash结构代替b+树结构。
- 一般是调大缓冲区,线程缓冲区。
- 关于架构优化,主要有两种,一个是引入第三方的技术栈调整业务架构,一个是调整数据库的部署架构。
- 引入第三方的技术栈首先想到的是引入redis做缓存,减少落入数据库的读请求,分担大部分的读压力,如果需要数据量大的且查询速度没有什么太高要求的可以引入比较大的缓存中间件比如oss和hbase。第二是引入消息队列做削峰处理,将并发情况下的写压力,平缓到数据库可以承受的级别。
- 调整数据库的架构部署:主要是读写分离,多主多写,垂直分库或水平分库。
- 查询时尽量不要使用*,连表查询时尽量不要关联太多表,多表查询时一定要以小驱大,不要使用like左模糊和全模糊查询,查询时尽量不要对字段做空值判断,不要在条件查询=前对字段做任何运算,!=、!<>、not in 、 not like 、or....要慎用,必要时可以强制使用索引,避免频繁创建和删除临时表,尽量将大事务拆分成多个小事务执行,从业务设计层面减少大量数据的返回,尽量避免深分页的情况出现,sql要写完整,尽量不要写简写,使用联合索引请确保字段的有序性,某些可以批量化完成的操作尽量批量化完成,明确返回单条数据时可使用limit 1
- 定位到具体的慢查询sql后,通过expalin工具分析语句,到底没走索引,还是由于扫描的数据量过大,然后对症下药。
- 首先可能是总体的现有连接数,超出了mysql中的最大连接数,此时再出现新连接时就会出现异常。客户端数据库连接池与mysql版本不匹配,或超时时间过小,也可能导致连接中断,mysql和java程序可能不在同一个网段,两台机器之间网络存在通信异常。部署mysql的机器资源耗尽,如cpu或内存,磁盘过高。