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

Tại sao Index chỉ được sử dụng khi bị ép buộc mà không được sử dụng theo mặc định?

để có hiệu suất tốt hơn, bạn có thể thử sử dụng chỉ mục tổng hợp .. dựa trên cột liên quan đến mệnh đề where của bạn
và cố gắng thay đổi mệnh đề IN trong một phép nối bên trong
giả sử nội dung mệnh đề IN của bạn là một tập hợp các giá trị cố định bạn có thể sử dụng union (hoặc một bảng mới với giá trị bạn cần)

ví dụ:sử dụng union (bạn có thể làm điều gì đó tương tự nếu mệnh đề IN là một truy vấn con)

select user_table.colA ,ColB , count(*) as count 
from user_table 
INNER JOIN  ( 
  select 'FIXED1' colA
  union
  select 'FIXED2'
  ....
  union 
  select 'FIXEDX'
  )  t on t.colA = user_table.colA  
where colC >='2019-09-01 00:00:00' 
      and ColB = 17  
group by colA ,ColB;

bạn cũng có thể thêm một chỉ mục tổng hợp trên bảng user_table trên các cột

   colA, colB, colC

cho những gì liên quan đến phần tử được sử dụng bởi trình tối ưu hóa truy vấn mysql để quyết định chỉ mục sử dụng một số khía cạnh và đối với tất cả những điều này, trình tối ưu hóa truy vấn chỉ định một chi phí
bất kỳ điều gì bạn nên xem xét

  • cột liên quan đến mệnh đề Where
  • Kích thước của các bảng (chứ không phải trường hợp kích thước của các bảng được tham gia)
  • Ước tính về số lượng hàng sẽ được tìm nạp (để quyết định sử dụng chỉ mục hay chỉ cần quét bảng)
  • nếu các kiểu dữ liệu khớp hay không giữa các cột trong mệnh đề jion và where
  • Việc sử dụng chức năng hoặc chuyển đổi kiểu dữ liệu bao gồm cả sự sai lệch đối chiếu
  • Kích thước của chỉ mục
  • bản chất của chỉ mục

và đối với tất cả các tùy chọn này được đánh giá là một chi phí và điều này dẫn đến lựa chọn chỉ mục

Trong trường hợp của bạn, colC as date có thể ngụ ý một chuyển đổi dữ liệu (tôn trọng các giá trị theo nghĩa đen dưới dạng chuỗi) và đối với điều này, chỉ mục không được chọn ..

Cũng vì lý do này mà tôi đã đề xuất một chỉ mục tổng hợp với cột ngoài cùng bên trái có liên quan đến các giá trị không được chuyển đổ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. Nhận TỐI ĐA từ NHÓM BẰNG

  2. tìm phần tử lớn thứ N trong SQL

  3. Truy vấn ngày hiện tại trong thời gian mysql

  4. Không thay thế thành có một mệnh đề where?

  5. Trường giống như tự động bổ sung cho các đối tượng có cùng khóa ngoại (Django 1.8, MySQL 5.5)