1) Try using ByteString or Text instead of String.
2) Try the UNPACK pragma, AFAIR it requires -O2.
data Key = Key {-# UNPACK #-} !ByteString {-# UNPACK #-}
!ByteString
https://hackage.haskell.org/package/ghc-datasize - this package
will help you to determine the actual data size