LSM-tree is favored in write-intensive scenarios due to its sequential write feature, but it grapples with read and write amplification issues. A common solution is to store keys and values separately, with the LSM-tree holding only the key and value address, while the value is kept separately. However, this approach presents challenges in range query and garbage collection, necessitating multiple random reads and pointless data rewriting. To address these issues, we introduce TreeKV, a system that uses a specialized B+ tree for value storage, grouping values with adjacent keys together. This reduces random reads during range queries and eliminates unnecessary data rewriting during garbage collection. We also delve into crash recovery and minimal-blocking garbage collection implementation in TreeKV. Our comparison with existing key-value separated stores shows that TreeKV, while maintaining high read-write performance, enhances range query and garbage collection performance.