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

MySQL:Làm cách nào để thực hiện truy vấn dải IP nhanh hơn? GeoIP

Tôi đang giải quyết một vấn đề tương tự, trong đó tôi phải tìm kiếm cơ sở dữ liệu với khoảng 4 triệu dải IP và tìm thấy một giải pháp tốt giúp giảm số lượng hàng được quét từ 4 triệu xuống còn khoảng ~ 5 (tùy thuộc vào IP):

Câu lệnh SQL này:

SELECT id FROM geoip WHERE $iplong BETWEEN range_begin AND range_end 

được chuyển đổi thành:

SELECT id FROM geoip WHERE range_begin <= $iplong AND range_end >= $iplong 

Vấn đề là MySQL truy xuất tất cả các hàng có 'range_begin <=$ iplong' và sau đó cần quét nếu 'range_end> =$ iplong'. Điều kiện AND đầu tiên này (range_begin <=$ iplong) đã truy xuất khoảng 2 Triệu hàng và tất cả đều cần được kiểm tra xem range_end có khớp hay không.

Tuy nhiên, điều này có thể được đơn giản hóa đáng kể bằng cách thêm một điều kiện VÀ:

SELECT id FROM geoip WHERE range_begin <= $iplong AND range_begin >= $iplong-65535 AND range_end >= $iplong 

Tuyên bố

range_begin <= $iplong AND range_begin >= $iplong-65535

chỉ truy xuất các mục nhập trong đó range_begin nằm trong khoảng từ $ iplong-65535 đến $ iplong. Trong trường hợp của tôi, điều này làm giảm số lượng hàng được truy xuất từ ​​4 Mio. còn khoảng 5 và thời gian chạy tập lệnh giảm từ nhiều phút xuống còn vài giây.

Ghi chú trên 65535 :Đây là cho bảng của tôi khoảng cách tối đa giữa range_begin và range_end, tức là (range_end-range_begin) <=65535 cho tất cả các hàng của tôi. Nếu bạn có dải IP lớn hơn, bạn phải tăng 65535, nếu bạn có dải IP nhỏ hơn, bạn có thể giảm hằng số này. Nếu hằng số này quá lớn (ví dụ 4 Tỷ), bạn sẽ không tiết kiệm được bất kỳ thời gian truy vấn nào.

Đối với truy vấn này, bạn chỉ cần một chỉ mục trên range_begin.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách xóa cơ sở dữ liệu trong MySQL / MariaDB

  2. chuyển các hàng của bảng thành cột trong mysql

  3. chuyển bảng từ lược đồ này sang lược đồ khác?

  4. Lỗi SQL tôi không thể tìm ra điều này

  5. Làm thế nào để sửa chữa máy chủ wamp mà không cần cài đặt lại?