一.设计或编码问题
- 数据库表设计是否合理,是否正确添加索引
- sql语句编写是否合理,查询的时候没有加索引
- sql语句编写不规范导致索引失效,改用全表扫描
- 数据库表的数据是否太大?是否需要分库分表?
- 程序设计缺陷导致死锁
索引失效的几种常见原因:
- 1)查询条件中出现or,!=,或<>
- 2)复合索引未用左列字段(最左匹配原则)
- 3)模糊查询 like以%开头;
- 4)where的判断条件对字段进行了null值判断。因为索引无法存储null
- 5)where中索引列使用了函数
- 6)where中索引列有运算
二. 机器资源问题
- 连接池资源不够用了,参数优化
- 数据库所在的硬件资源情况:当查询慢的时候,内存占了多少?mysql磁盘IO是不是被其它应用共享且占用高?cpu是不是有负载?
1) 硬件资源本身不够>加资源
2)硬件资源因为和其它进程共享,导致资源不够,可以考虑做资源隔离
3)硬件资源性能不足,比如磁盘可以考虑换成SSD - 网络资源
1)应用连接数据库的网络是不是抖动,延时较高
三. 高并发量导致
- 如果数据量真的炒鸡大,分库分表已经不能满足查询了,考虑将热点数据在redis做缓存。应用架构调整,把缓存模块加进去。
- 如果已经加了缓存还是慢,会不会是缓存雪崩了?击穿了?缓存命中率低?
- 缓存任然不能满足查询要求,比如很多字段的查询,可以将查询字段放到ES等大数据组件中,先查ES,ES拿到数据主键id再到MySQL中查询用户请求突然增加,导致查询变慢上有系统出现bug,导致循环调用接口做查询,这个时候是不是考虑异常情况限流