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

Truy vấn SQL tìm kiếm các hàng thỏa mãn Column1 <=X <=Column2 rất chậm

Tôi đã tìm thấy một giải pháp dựa vào các thuộc tính của dữ liệu trong bảng. Tôi muốn có một giải pháp tổng quát hơn không phụ thuộc vào dữ liệu hiện tại, nhưng trong thời điểm hiện tại đó là giải pháp tốt nhất mà tôi có.

Vấn đề với truy vấn ban đầu:

SELECT P, Y, Z FROM SomeTable WHERE FirstX <= ? AND LastX >= ? LIMIT 10;

là việc thực thi có thể yêu cầu quét một tỷ lệ lớn các mục nhập trong FirstX , LastX , P lập chỉ mục khi điều kiện đầu tiên FirstX <= ? được phần lớn các hàng hài lòng.

Những gì tôi đã làm để giảm thời gian thực thi là quan sát rằng LastX-FirstX tương đối nhỏ.

Tôi đã chạy truy vấn:

SELECT MAX(LastX-FirstX) FROM SomeTable;

và nhận 4200000 .

Điều này có nghĩa là FirstX >= LastX – 4200000 cho tất cả các hàng trong bảng.

Vì vậy, để đáp ứng LastX >= ? , chúng ta cũng phải thỏa mãn FirstX >= ? – 4200000 .

Vì vậy, chúng ta có thể thêm một điều kiện vào truy vấn như sau:

SELECT P, Y, Z FROM SomeTable WHERE FirstX <= ? AND FirstX >= ? - 4200000 AND LastX >= ? LIMIT 10;

Trong ví dụ mà tôi đã kiểm tra trong câu hỏi, số lượng mục nhập chỉ mục được xử lý đã giảm từ 2104820 thành 18 và thời gian chạy đã giảm từ 0,563 giây thành 0,0003 giây .

Tôi đã thử nghiệm truy vấn mới với cùng một 120000 các giá trị của X . Đầu ra giống với truy vấn cũ. Thời gian đã giảm xuống từ hơn 10 giờ đến 5,5 phút , nhanh hơn 100 lầ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. Chuyển mã QR vào cơ sở dữ liệu MySql

  2. Đặt giá trị =giá trị +1 trong bookshelf.js

  3. Làm cách nào để sử dụng jQuery để chạy các truy vấn MySQL?

  4. Sử dụng mysql_real_escape_string để ngăn SQL Injection ở đâu?

  5. Các vấn đề về hiệu suất khi chạy cơ sở dữ liệu trong bộ chứa docker