2011-08-11 33 views
6

Chúng tôi có bảng hiện có cột TEXT và độ dài cột trung bình khoảng 2.000 ký tự. Chúng tôi muốn biết hiệu suất của các truy vấn chọn cột đó sẽ là gì nếu trung bình là 5k, 10k, 20k, v.v.Thời gian truy vấn MySQL tăng theo cấp số nhân khi dữ liệu trong cột TEXT tăng tuyến tính

Chúng tôi thiết lập một thử nghiệm riêng biệt và nhận thấy rằng độ dài của cột TEXT tăng tuyến tính, thời gian truy vấn tăng lên theo cấp số nhân.

Bất kỳ ai cũng có bất kỳ suy nghĩ nhanh về lý do tại sao điều này có thể xảy ra. Có thể cung cấp thêm thông tin nhưng khá thẳng về phía trước.

+0

Bạn đã sử dụng chỉ mục văn bản đầy đủ kết hợp với 'đối sánh với'. Đây là cách được đề xuất cho các cột văn bản tìm kiếm. – Johan

+0

Chúng tôi không tìm kiếm trong cột TEXT, chỉ cần chọn nó.CHỌN * TỪ t TẠI ĐÂY t.id <50; vv –

+0

SELECT * là hình thức rất xấu, chỉ chọn các trường mà bạn thực sự cần. Bởi vì bạn (có khả năng) gửi rất nhiều dữ liệu không cần thiết qua dây. Ngoài ra nếu bạn đang sử dụng InnoDB bạn đang giết chết cơ hội sử dụng các chỉ mục bao gồm, cũng lưu ý câu trả lời của @ Mchl. – Johan

Trả lời

1

Một trong những lý do có thể là vì các trường TEXTBLOB không được lưu cùng với tất cả các trường 'thông thường' khác, do đó cơ sở dữ liệu thực sự cần phải lấy chúng từ một vùng đĩa khác.

Chúng tôi cần xem truy vấn của bạn Có phải đây chỉ là tra cứu theo trường ID hoặc bạn có tìm kiếm trong trường TEXT không? Trong trường hợp thứ hai như chiều dài trung bình của văn bản được lưu trữ tăng lên, do đó, số lượng dữ liệu cho cơ sở dữ liệu để xử lý và nó phát triển theo cấp số nhân.

+0

có, nhưng tại sao theo cấp số nhân? –

+0

... không có nó không phải là mũ ... Tôi đã sai về điều đó. Hãy tưởng tượng một cái gì đó khác trong tâm trí của tôi, nhưng khi bắt đầu tính toán nó, nó vẫn tuyến tính, P – Mchl

+0

Kiểm tra riêng biệt của chúng tôi là một bảng với 2 cột: một id và một cột TEXT. Truy vấn của chúng tôi đang chọn từ bảng theo id theo số gia là 50. Vì vậy, nói rằng nó có 1000 hàng, chúng tôi sẽ thực hiện 0

0

Bạn có thể chọn chỉ những lĩnh vực mà bạn muốn xem sử dụng limit:

SELECT field1, f2, f3 FROM table1 ORDER BY id LIMIT 0,30 

Đối với 30 hàng tiếp theo làm

SELECT field1, f2, f3 FROM table1 ORDER BY id LIMIT 30,30 

Bạn không bao giờ có thể đọc 10k hàng trong một đi dù sao, điều này sẽ làm cho lựa chọn của bạn nhanh hơn nhiều.

0

này có liên quan đến bao nhiêu dữ liệu có thể MySQL đọc trong một chu kỳ đĩa đọc,
và bao nhiêu dữ liệu có thể được gửi qua mạng trong một dữ liệu gửi chu kỳ

khi tăng trưởng kích thước dữ liệu, nhiều hơn các chi phí sẽ trên

  • chu kỳ đĩa đọc (mysql dành nhiều thời gian trong lịch sử tìm kiếm)
  • dữ liệu gửi (yêu cầu chu kỳ hơn để cho phép truyền dữ liệu qua mạng)

không phải tất cả dữ liệu được lưu trữ trong bộ nhớ đặc biệt là trên văn bản và blob,
mysql cần phải tìm thấy dữ liệu từ đĩa,
và chuyển lại cho khách hàng

nói cách khác, chỉ số mysql là nhanh,
vì nó không yêu cầu đĩa đọc

+0

Tôi chủ yếu đồng ý với phân tích của bạn, nhưng tôi muốn một cách để chứng minh điều đó ... –

+0

so sánh tốc độ đọc/ghi đĩa – ajreal

0

Đây là một dự đoán rất hoang dã, nhưng điều này có thể là một vấn đề triển khai ở mức thấp, MySql không mong đợi bạn truy xuất quá nhiều dữ liệu cùng một lúc để nó phải phân bổ lại khối lớn hơn bộ nhớ để sử dụng nội bộ và sao chép dữ liệu từ vị trí cũ sang vị trí mới và lặp lại điều này qua d trên một lần nữa khi dữ liệu phát triển, đây là điều duy nhất đến với tâm trí của tôi mà có thể giải thích thời gian truy vấn đi lên theo cấp số nhân trong khi dữ liệu phát triển tuyến tính. Giải pháp của bạn là giới hạn số lượng dữ liệu bạn truy xuất cùng một lúc.

Các vấn đề liên quan