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

Lọc bộ kết quả truy vấn MySQL để mang lại nhiều lần xuất hiện trong một khoảng thời gian cụ thể

Nếu chúng ta muốn lọc ra các hàng không có ít nhất bốn hàng trước đó trong vòng 60 giây qua, giả sử rằng dateTimeOrigination là kiểu số nguyên, dấu thời gian kiểu unix 32 bit, chúng ta có thể làm như sau:

SELECT FROM_UNIXTIME(r.dateTimeOrigination) AS dateTimeOrigination
     , r.callingPartyNumber
     , r.originalCalledPartyNumber
     , r.finalCalledPartyNumber
     , r.duration
     , r.origDeviceName
     , r.destDeviceName
  FROM cdr_records r
 WHERE r.dateTimeOrigination >= UNIX_TIMESTAMP('2016-05-20')
   AND r.dateTimeOrigination  < UNIX_TIMESTAMP('2016-05-21')
   AND r.callingPartyNumber NOT LIKE 'b00%'
   AND r.originalCalledPartyNumber NOT LIKE 'b00%'
   AND r.finalCalledPartyNumber NOT LIKE 'b00%'

   AND ( SELECT COUNT(1)
           FROM cdr_records c
          WHERE c.originalCalledPartyNumber = r.originalCalledPartyNumber
            AND c.dateTimeOrigination       > r.dateTimeOrigination - 60
            AND c.dateTimeOrigination      <= r.dateTimeOrigination
       ) > 4

 ORDER
    BY r.originalCalledPartyNumber
     , r.dateTimeOrigination

LƯU Ý:Đối với hiệu suất, chúng tôi muốn có các vị từ trên các cột trống.

Với một biểu mẫu như thế này, với cột được bao bọc trong một biểu thức:

 WHERE FROM_UNIXTIME(r.dateTimeOrigination) LIKE '2016-05-20%'

MySQL sẽ đánh giá hàm cho mọi hàng trong bảng, sau đó so sánh kết quả trả về từ hàm với chữ.

Với một biểu mẫu như thế này:

 WHERE r.dateTimeOrigination >= UNIX_TIMESTAMP('2016-05-20')
   AND r.dateTimeOrigination  < UNIX_TIMESTAMP('2016-05-21')

MySQL sẽ đánh giá các biểu thức ở phía bên phải một thời gian, dưới dạng nghĩa đen . Điều này cho phép MySQL sử dụng hiệu quả hoạt động quét phạm vi trên một chỉ mục phù hợp.

THEO DÕI

Để có hiệu suất tốt nhất của truy vấn bên ngoài, chỉ mục tốt nhất có thể sẽ là chỉ mục có cột đứng đầu là dateTimeOrigination, tốt nhất là chứa

... ON cdr_records (dateTimeOrigination
    ,callingPartyNumber,originalCalledPartyNumber,finalCalledPartyNumber)

Để có hiệu suất tốt nhất, một chỉ mục bao trùm, để tránh tra cứu các trang trong bảng bên dưới. Ví dụ:

... ON cdr_records (dateTimeOrigination
    ,callingPartyNumber,originalCalledPartyNumber,finalCalledPartyNumber
    ,duration,origDeviceName,destDeviceName)

Với điều đó, chúng tôi mong đợi EXPLAIN sẽ hiển thị "Sử dụng chỉ mục".

Đối với truy vấn con có tương quan, chúng tôi muốn có một chỉ mục với các cột đứng đầu như sau:

... ON cdr_records (originalCalledPartyNumber,dateTimeOrigination)

Tôi thực sự khuyên bạn nên xem đầu ra từ EXPLAIN để xem MySQL đang sử dụng chỉ mục nào cho truy vấn.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kích thước tối đa của chỉ mục DUY NHẤT trong MySQL

  2. Xuất và nhập tất cả cơ sở dữ liệu MySQL cùng một lúc

  3. Câu hỏi về MySQL - Khóa duy nhất Không hoạt động chính xác, hay tôi đang hiểu nhầm?

  4. đề xuất cấu trúc bảng mysql?

  5. MysqlDump từ mã hóa Powershell và Windows