InnoDB lưu trữ các bảng "rộng" theo một cách khác. Thay vì có tất cả các cột cùng nhau trong một chuỗi duy nhất (cộng thêm chi phí, chẳng hạn như độ dài, v.v.), nó thực hiện như sau:
- Nếu tổng tất cả các cột của một hàng nhất định vượt quá khoảng 8KB, nó sẽ di chuyển một số dữ liệu sang một vùng lưu trữ ("không được lưu") khác.
- Những cột nào được di chuyển ra khỏi bản ghi tùy thuộc vào kích thước của các cột, v.v.
- Các chi tiết phụ thuộc vào
ROW_FORMAT
đã chọn. - "Không lưu" là một khối (hoặc các khối) 16KB khác.
- Sau đó, khi thực hiện
SELECT *
(hoặc ít nhất là tìm nạp (các) cột ngoài bản ghi), nó phải thực hiện một lần tìm nạp đĩa khác.
Làm gì?
- Suy nghĩ lại về việc có quá nhiều cột.
- Xem xét "phân vùng theo chiều dọc", trong đó bạn có (các) bảng khác chứa
TEXT
đã chọn cột. Đề xuất chọn các nhóm cột dựa trên các mẫu truy cập trong ứng dụng của bạn. - Đối với các cột thường khá dài, hãy xem xét nén chúng trong ứng dụng khách và lưu trữ thành một
BLOB
thay vìTEXT
. Hầu hết "văn bản" thu nhỏ lại 3:1. Các đốm màu được gửi ra ngoài bản ghi giống như Văn bản, tuy nhiên, các đốm màu nén này sẽ nhỏ hơn, do đó ít khả năng bị tràn hơn. - Thực hiện nhiều xử lý hơn trong SQL - để tránh trả lại tất cả các hàng hoặc tránh trả lại toàn bộ văn bản, v.v. Khi đưa nhiều văn bản cho máy khách một cách mù quáng, mạng và máy khách sẽ trở thành một yếu tố quan trọng trong thời gian trôi qua, không chỉ là
SELECT
, chính nó.