1. 使用场景
- 在做项目中的数据日报的时候,需要实时的去查询,所以需要关联的表比较多,所以造成数据查询比较慢
2. 问题分析
- 看能不能优化一下业务,减少表之间的关联
- 看一下是不是需要添加一些索引,使用索引进行优化
3. 问题解决
- 在业务方面已经没有什么可以优化的地方了,所以表关联优化失败
- 该添加的索引已经加上了,没有再可以添加的索引了
- 最后,实在没办法了,只能通过使用数据库底层存储原理的知识来进行分析了
- 中所周知,数据库底层存储使用B+树,并且是典型的行式存储数据库,数据在数据库中时以数据页的形式来存储在磁盘上,一般来说每个数据页大小是16KB
- 也就是说,如果一条记录字段过多或者数据过多,那么每个数据页存储的记录就很少,就需要更多的数据页,每次查询都需要从磁盘读取,需要消耗IO资源,频繁的读取就需要消耗更多的IO资源
- 但是我们是不能通过改减少字段或减少数据来优化查询,这个是不可能的
- 所以在数据库中存在这种思想吗,或者方法吗?存在的,就是索引下推
- 就是一个查询中字段如果都在联合索引中,数据库会计算使用索引下推还是其他索引方式更加消耗资源
- 一般来说,如果表字段过多,极端情况下有超过50多个,一般索引下推是可以选择的
- 所以找出了一张表,其字段共有60个左右,但是在这个SQL实际使用到的也才7个左右,并且数据记录数大概在百万级,所以使用了索引下推这种极端方式
- 最后,查询时间优化减少了一半好多
4. 总结
- 最后会有人问,为什么不优化表结构,拆分表呢,或者是分表呢
- 答:
- 中途入场,属于半运维项目,并且这个表用的太频繁了,臣妾做不到😑
- 这边分工比较明确,而且我不是DBA,没法从服务器中优化数据库
- 存在索引失效的情况,即使解决了,查询依旧很慢