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

Tôi nên bắt đầu lập chỉ mục cho truy vấn có hai điều kiện phạm vi như thế nào?

IN nằm giữa = và một 'phạm vi'. Vì vậy, tôi phân minh với tiêu đề trên Câu hỏi. Hai phạm vi hầu như không thể tối ưu hóa; một IN cộng với một phạm vi có một số cơ hội tối ưu hóa.

Dựa trên

WHERE `StartedAt` >= FROM_UNIXTIME(1518990000)  
AND   `StartedAt` <  FROM_UNIXTIME(1518998400) 
AND `DeviceId` IN (
    UNHEX('00030000000000000000000000000000'),
    UNHEX('000300000000000000000000000181cd'),
    UNHEX('000300000000000000000000000e7cf6'),
    UNHEX('000300000000000000000000000e7cf7'),
    UNHEX('000300000000000000000000000f423f')
) AND `MarkedForDeletion` = FALSE

Tôi sẽ cung cấp 2 chỉ mục và để Trình tối ưu hóa quyết định sử dụng chỉ mục nào:

INDEX(MarkedForDeletion, StartedAt, DeviceId)
INDEX(MarkedForDeletion, DeviceId, StartedAt)

Một số phiên bản MySQL / MariaDB mới hơn có thể đi tắt đón đầu và sử dụng tất cả 3 cột trong giây mục lục. Trong tất cả các phiên bản, 2 cột đầu tiên của một trong hai chỉ mục làm cho nó trở thành một ứng cử viên. Sự lựa chọn có thể được thúc đẩy bởi số liệu thống kê và có thể (hoặc có thể không) là sự lựa chọn 'đúng đắn'.

Kể từ AlarmId không thể là NULL , sử dụng mẫu:COUNT(*) .

Sau khi thực hiện thay đổi đó, mỗi chỉ mục của tôi sẽ "phủ sóng", do đó tăng thêm hiệu suất.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Danh sách SELECT không nằm trong mệnh đề GROUP BY và chứa cột không được tổng hợp .... không tương thích với sql_mode =only_full_group_by

  2. So sánh Percona XtraBackup với MySQL Enterprise Backup:Phần một

  3. Tìm kiếm toàn văn bản trong MySQL:Tốt, xấu và xấu

  4. Ruby on Rails MySQL # 08S01Bad bắt tay - hạ cấp MySQL?

  5. Làm thế nào để chuyển đổi từ varbinary sang char / varchar trong mysql