Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm thế nào để tăng tốc độ đếm chọn (*) với nhóm theo và ở đâu?

Dưới đây là một số điều tôi muốn thử, để tăng độ khó:

(dễ dàng hơn) - Đảm bảo rằng bạn có chỉ mục bao phủ phù hợp

CREATE INDEX ix_temp ON relations (relation_title, object_title);

Điều này sẽ tối đa hóa hiệu suất dựa trên lược đồ hiện có của bạn, vì (trừ khi phiên bản trình tối ưu hóa của mySQL của bạn thực sự quá ngu ngốc!) Nó sẽ giảm thiểu số lượng I / Os cần thiết để đáp ứng truy vấn của bạn (không giống như nếu chỉ mục theo thứ tự ngược lại với toàn bộ chỉ mục phải được quét) và nó sẽ bao phủ truy vấn, do đó bạn sẽ không phải chạm vào chỉ mục được phân nhóm.

(khó hơn một chút) - đảm bảo các trường varchar của bạn càng nhỏ càng tốt

Một trong những thách thức hoàn hảo với chỉ mục varchar trên MySQL là khi xử lý một truy vấn, kích thước được khai báo đầy đủ của trường sẽ được kéo vào RAM. Vì vậy, nếu bạn có varchar (256) nhưng chỉ sử dụng 4 ký tự, bạn vẫn phải trả mức sử dụng RAM 256 byte trong khi truy vấn đang được xử lý. Ầm ầm! Vì vậy, nếu bạn có thể thu hẹp giới hạn varchar của mình một cách dễ dàng, điều này sẽ tăng tốc các truy vấn của bạn.

(khó hơn) - Chuẩn hóa

30% các hàng của bạn có một giá trị chuỗi duy nhất là một dấu hiệu rõ ràng cho việc chuẩn hóa thành một bảng khác để bạn không sao chép chuỗi hàng triệu lần. Cân nhắc chuẩn hóa thành ba bảng và sử dụng các ID số nguyên để kết hợp chúng.

Trong một số trường hợp, bạn có thể chuẩn hóa dưới các trang bìa và ẩn quá trình chuẩn hóa với các dạng xem khớp với tên của bảng hiện tại ... sau đó bạn chỉ cần thực hiện các truy vấn CHÈN / CẬP NHẬT / XÓA của mình về quá trình chuẩn hóa nhưng có thể để yên các CHỌN của bạn .

(khó nhất) - Băm các cột chuỗi của bạn và lập chỉ mục các hàm băm

Nếu việc chuẩn hóa có nghĩa là thay đổi quá nhiều mã, nhưng bạn có thể thay đổi giản đồ của mình một chút, bạn có thể muốn xem xét việc tạo mã băm 128 bit cho các cột chuỗi của mình (sử dụng Hàm MD5 ). Trong trường hợp này (không giống như chuẩn hóa), bạn không phải thay đổi tất cả các truy vấn của mình, chỉ có INSERT và một số SELECT. Dù sao đi nữa, bạn sẽ muốn băm các trường chuỗi của mình, rồi tạo chỉ mục trên các hàm băm, ví dụ:

CREATE INDEX ix_temp ON relations (relation_title_hash, object_title_hash);

Lưu ý rằng bạn sẽ cần phải thực hiện với SELECT để đảm bảo rằng bạn đang thực hiện tính toán thông qua chỉ mục băm và không kéo chỉ mục được phân cụm vào (bắt buộc để giải quyết giá trị văn bản thực tế của object_title để đáp ứng truy vấn).

Ngoài ra, nếu quan hệ_title có kích thước varchar nhỏ nhưng tiêu đề đối tượng có kích thước dài, thì bạn có thể chỉ băm object_title và tạo chỉ mục trên (relation_title, object_title_hash) .

Lưu ý rằng giải pháp này chỉ hữu ích nếu một hoặc cả hai trường này rất dài so với kích thước của hàm băm.

Cũng lưu ý rằng có những tác động phân biệt chữ hoa chữ thường / đối chiếu thú vị từ việc băm, vì hàm băm của một chuỗi chữ thường không giống như hàm băm của chuỗi chữ hoa. Vì vậy, bạn sẽ cần đảm bảo rằng bạn áp dụng chuẩn hóa cho các chuỗi trước khi băm chúng - trong các từ khác, chỉ băm chữ thường nếu bạn đang ở trong DB không phân biệt chữ hoa chữ thường. Bạn cũng có thể muốn cắt bớt các khoảng trắng từ đầu hoặc cuối, tùy thuộc vào cách DB của bạn xử lý các khoảng trắng ở đầu / cuối.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để tạo mô-đun Sinh nhật sắp tới trong Rails?

  2. MySQL hoặc điều kiện

  3. Số tham số không hợp lệ:tham số không được xác định Chèn dữ liệu

  4. BLOB có được chuyển đổi bằng cách sử dụng bộ ký tự hiện tại / mặc định trong MySQL không?

  5. Sử dụng PHP để tải tệp lên và thêm đường dẫn đến cơ sở dữ liệu MySQL