用分解关联查询的方式查询具有以下优势:
- 多次单表查询,让缓存的效率更高
- 许多应用程序可以方便地缓存单表查询对应的结果对象
- 对于MYSQL的查询缓存来说,如果关联中的某个表发生了变化,就无法使用查询缓存。而拆分后如果某个表很少改变,那么基于该表的查询就可以重复利用查询缓存结果。
- 将查询分解后,执行单个查询可以减少锁的竟争。
- 在应用层做关联,可以更容易对数据库进行拆分,更容易做到高性能和可扩展。很多高性能的应用都会对关联查询进行分解。
- 查询效率也可能会有所提升,使用 IN() 代替关联査询,可以让 MYSQL 按照 ID 顺序进行査询,可能比随机的关联要更高效。
- 可以减少冗余记录的查询;在应用层做关联査询,意味着对于某条记录应用只需要查询一次,而在数据库中做关联查询,则可能需要重复地访问一部分数据。从这点看,这样的重构还可能会减少网络和内存的消耗。
- 这样做相当于在应用中实现了哈希关联,而不是使用 MYSQL 的嵌套循环关联。某些场景哈希关联的效率要高很多。
- 单表查询有利于后期数据量大了分库分表,如果联合查询的话,一旦分库,原来的sql都需要改动。
- 大数据量适合多次单表,小数据量可能适合多表联查(不要超过三张表避免笛卡尔积过大),因为多次查询有多次发送sql的开销。实际场景根据测试选用性能高者。