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

MySQL không sử dụng chỉ mục (Sử dụng filesort) khi sử dụng ORDER BY

Bạn không thể sử dụng chỉ mục trong trường hợp này, vì bạn sử dụng RANGE điều kiện lọc.

Nếu bạn sử dụng một cái gì đó như:

SELECT  *
FROM    values_table this_
WHERE   this_.value1 = @value
ORDER BY
        value2
LIMIT 10

, sau đó tạo chỉ mục tổng hợp trên (VALUE1, VALUE2) sẽ được sử dụng cả để lọc và đặt hàng.

Nhưng bạn sử dụng một điều kiện phạm vi, đó là lý do tại sao bạn vẫn cần phải thực hiện đặt hàng.

Chỉ mục tổng hợp của bạn sẽ giống như sau:

value1 value2
-----  ------
1      10
1      20
1      30
1      40
1      50
1      60
2      10
2      20
2      30
3      10
3      20
3      30
3      40

và nếu bạn chọn 12 trong value1 , bạn vẫn không nhận được toàn bộ tập hợp value2 được sắp xếp .

Nếu chỉ mục của bạn trên value2 không có tính chọn lọc cao (tức là không có nhiều DISTINCT value2 trong bảng), bạn có thể thử:

CREATE INDEX ix_table_value2_value1 ON mytable (value2, value1)

/* Note the order, it's important */    

SELECT  *
FROM    (
        SELECT  DISTINCT value2
        FROM    mytable
        ORDER BY
                value2
        ) q,
        mytable m
WHERE   m.value2 >= q.value2
        AND m.value2 <= q.value2
        AND m.value1 BETWEEN 13123123 AND 123123123

Đây được gọi là SKIP SCAN phương thức truy cập. MySQL không hỗ trợ nó trực tiếp, nhưng nó có thể được mô phỏng như thế này.

RANGE quyền truy cập sẽ được sử dụng trong trường hợp này, nhưng có thể bạn sẽ không nhận được bất kỳ lợi ích hiệu suất nào trừ khi DISTINCT value2 bao gồm ít hơn khoảng 1% trong số các hàng.

Lưu ý việc sử dụng:

m.value2 >= q.value2
AND m.value2 <= q.value2

thay vì

m.value2 = q.value2

Điều này làm cho MySQL thực hiện RANGE kiểm tra từng vòng lặp.



  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 theo chuỗi với số

  2. Thay đổi định dạng ngày (trong DB hoặc đầu ra) thành dd / mm / yyyy - PHP MySQL

  3. Cách tốt nhất để kết nối với cơ sở dữ liệu Mysql trong Delphi là gì

  4. Neo4j - Nhập dữ liệu từ tệp CSV bằng Cypher

  5. khóa chính hỗn hợp (chữ và số) và tự động tăng dần