数据库查询数据的注意点
- 尽量使用索引覆盖,减少回表所消耗的时间。即查询时知名对应的列,而不是select *
- 如果组建联合索引,尽量将区分度最高的放最左边,考虑最左匹配原则
- 对索引进行函数操作或表达式计算会导致索引失效
- 利用子查询优化超多分页场景
- 在开启事务后,在事务内尽可能只操作数据库,并有意识地减少锁的持有时间
使用了索引,线上查询还是很慢,怎么解决?
这种情况,一般是表的数据量太大了。
首先,考虑能不能把旧的数据删掉(但一般不会删)。然后,考虑在查询数据库之前,直接走一层缓存(redis),但这个需要考虑业务能不能忍受读取非真正实时的数据。其次,看是不是有字符串检索场景导致查询低效,若有,可以考虑将表的数据导入Elastic search类的搜索引擎。最后,可以考虑根据查询条件的维度,做相应的聚合表,线上的请求就查询聚合表的数据,不走原表。
MySQL读写遇到瓶颈,怎么解决?
- 若是单库,考虑升级至主从架构,实现读写分离
- 若是主从架构,考虑分库分表
总结:
- 数据库表存在一定数据量,就需要有对应的索引发现慢查询时,检查是否走对索引,是否能用更好的索引进行优化查询速度
- 当索引解决不了慢查询时,一般由于业务表的数据量太大导致,利用空间换时间的思想(NOSQL、聚合、冗余...)
- 当读写性能均遇到瓶颈时,先考虑能否升级数据库架构即可解决问题,若不能则需要考虑分库分表