Log-Structured Merge Trees How LSM trees trade read performance for fast writes, and what I got wrong along the way