diff --git a/lib/mergeset/part.go b/lib/mergeset/part.go
index 4554e10828..f8f45f1b88 100644
--- a/lib/mergeset/part.go
+++ b/lib/mergeset/part.go
@@ -136,6 +136,9 @@ func (p *part) MustClose() {
 
 type indexBlock struct {
 	bhs []blockHeader
+
+	// The buffer for holding the data referrred by bhs
+	buf []byte
 }
 
 func (idxb *indexBlock) SizeBytes() int {
diff --git a/lib/mergeset/part_search.go b/lib/mergeset/part_search.go
index a2f2c181dd..65504ec156 100644
--- a/lib/mergeset/part_search.go
+++ b/lib/mergeset/part_search.go
@@ -285,8 +285,10 @@ func (ps *partSearch) readIndexBlock(mr *metaindexRow) (*indexBlock, error) {
 	if err != nil {
 		return nil, fmt.Errorf("cannot decompress index block: %w", err)
 	}
-	idxb := &indexBlock{}
-	idxb.bhs, err = unmarshalBlockHeadersNoCopy(idxb.bhs[:0], ps.indexBuf, int(mr.blockHeadersCount))
+	idxb := &indexBlock{
+		buf: append([]byte{}, ps.indexBuf...),
+	}
+	idxb.bhs, err = unmarshalBlockHeadersNoCopy(idxb.bhs[:0], idxb.buf, int(mr.blockHeadersCount))
 	if err != nil {
 		return nil, fmt.Errorf("cannot unmarshal block headers from index block (offset=%d, size=%d): %w", mr.indexBlockOffset, mr.indexBlockSize, err)
 	}