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

Lập chỉ mục MySQL và Sử dụng filesort

Trong truy vấn đầu tiên của bạn, ORDER BY được thực hiện bằng cách sử dụng views_point INDEX, vì nó được sử dụng trong phần WHERE của truy vấn và do đó trong MySQL có thể được sử dụng để sắp xếp.

Trong truy vấn thứ hai, MySQL giải quyết phần WHERE bằng cách sử dụng một chỉ mục khác, listing_pcs . Điều này không thể được sử dụng để thỏa mãn điều kiện ORDER BY. MySQL sử dụng filesort để thay thế, đây là tùy chọn tốt nhất nếu không thể sử dụng chỉ mục.

MySQL chỉ sử dụng các chỉ mục để sắp xếp nếu chỉ mục giống với chỉ mục được sử dụng trong điều kiện WHERE. Đây là nội dung hướng dẫn sử dụng nghĩa là:

Vậy bạn có thể làm gì:

  1. Thử tăng sort_buffer_size của bạn tùy chọn cấu hình để làm cho việc phân loại tệp hiệu quả nhất có thể. Kết quả lớn quá lớn đối với bộ đệm sắp xếp khiến MySQL chia nhỏ việc sắp xếp thành nhiều phần, điều này sẽ chậm hơn.

  2. Buộc MySQL chọn một chỉ mục khác. Cần lưu ý rằng các phiên bản MySQL khác nhau chọn các chỉ mục mặc định khác nhau. Ví dụ:phiên bản 5.1 khá tệ vì Trình tối ưu hóa truy vấn đã được viết lại rất nhiều cho bản phát hành này và cần nhiều cải tiến. Phiên bản 5.6 khá tốt.

    SELECT *
    FROM listings
    FORCE INDEX (views_point)
    WHERE (`publishedon_hourly` BETWEEN
           UNIX_TIMESTAMP( '2015-09-5 00:00:00' )
           AND UNIX_TIMESTAMP( '2015-09-5 12:00:00' ))
      AND (published =1)
      AND cat_id IN ( 1, 2, 3, 4, 5 )
    ORDER BY `views_point` DESC
    LIMIT 10
    


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thứ tự MySQL trước khi Nhóm theo

  2. Các giao dịch lồng nhau có được phép trong MySQL không?

  3. MySQL - Kết hợp nhiều điều kiện WHEN trong CASE

  4. Các tùy chọn chọn nguồn cấp dữ liệu từ DB tùy thuộc vào các tùy chọn chọn khác

  5. Truy vấn LEFT OUTER JOIN không trả về các hàng mong đợi