2012-01-16 34 views
5

lý do tại sao hoặc cách giải quyết vấn đề trên mysql.MySQL SELECT rất chậm vì LONGBLOB

table xxx 
-> id primary key 
-> name varchar 255 
-> data longblob 

khi tôi lưu trữ để bảng này 100 tác phẩm, mỗi 100MB, bảng sẽ có 10GB

và sau đó cố gắng chọn bất kỳ hàng ... nó cần để lâu

SELECT name FROM xxx WHERE id = 50 LIMIT 1; 

mất khoảng 8 giây

vấn đề của tôi có thể trong đó, mysql đọc toàn bộ hàng trước khi trả về name, chỉ 255 ký tự ... vì vậy khi tôi muốn liệt kê tên của 100 tệp, m ysql đọc 10 GB và trả lại khoảng 2 KB kết quả.

+0

StackExchange hiển thị bản xem trước câu hỏi/câu trả lời của bạn khi bạn viết câu hỏi. Vui lòng xem trước và đảm bảo định dạng chính xác. Nếu mã được định dạng trước bạn viết được hiển thị dưới dạng một dòng trong bản xem trước, đó là cách nó sẽ hiển thị với mọi người khác. Vì vậy, sử dụng nút "mẫu mã" để định dạng đúng (hoặc chỉ cần đặt 4 dấu cách trước mỗi dòng và SE sẽ biết mã được định dạng sẵn). –

Trả lời

6

Thử tách các đốm màu thành một bảng riêng biệt.

Ví dụ, bạn có thể có một bảng xxx chứa các cột idname, và một bảng xxx_data chứa các cột iddata. Nếu bạn chỉ muốn tên, bạn không cần truy vấn bảng xxx_data chút nào; nếu bạn cần cả hai tên và dữ liệu, bạn có thể tham gia các bảng lại với nhau bằng cách sử dụng chia sẻ chính chủ chốt id:

SELECT id, name, data 
FROM xxx JOIN xxx_data USING (id) 
WHERE id = ... 

Để biết thêm thông tin và tối ưu hóa những ý tưởng, xem ví dụ 10 tips for optimizing MySQL queries.

+2

Tôi sẽ chỉ thêm vào phần trên của điều này mà bạn nên xem xét việc lưu trữ các tệp này trên hệ thống tệp thay vì trong cơ sở dữ liệu. Tất nhiên có những lý do để lưu trữ chúng trong cơ sở dữ liệu (như bảo mật, dễ xóa, dễ dàng sao chép trên nhiều máy chủ vv) nhưng hãy tưởng tượng rằng bạn muốn trả về 10 tệp ... bạn truy vấn cơ sở dữ liệu và sau đó lưu trữ 10 * 100MB trong RAM. Bạn có thực sự muốn tiêu thụ 1GB RAM trên máy chủ của bạn chỉ để trả lại các tệp, trong khi bạn chỉ có thể truyền chúng từ một số vị trí trên máy chủ của bạn? Tôi nghĩ rằng các tệp của bạn quá lớn để được lưu trữ trong cơ sở dữ liệu. –

+1

Nếu bạn không hoàn toàn cần dữ liệu trong cơ sở dữ liệu, bạn cũng có thể di chuyển nó vào hệ thống tập tin. Tôi nghĩ rằng điều này hoạt động tốt hơn khi bạn đang xử lý một lượng lớn tệp hoặc tệp lớn. –