Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wydajne wyszukiwanie w tabeli zakresów

Biorąc pod uwagę, że masz już indeks na ip_start , w ten sposób najlepiej z niego korzystać, zakładając, że chcesz uzyskać jeden dostęp na adres IP (1234 w tym przykładzie):

select organization from (
    select ip_end, organization
    from iptable
    where ip_start <= 1234
    order by ip_start desc
    limit 1
) subqry where 1234 <= ip_end

Spowoduje to użycie indeksu do rozpoczęcia skanowania, które zatrzymuje się natychmiast z powodu limit 1 . Koszt powinien być tylko nieznacznie wyższy niż koszt prostego dostępu indeksowanego. Oczywiście ta technika opiera się na fakcie, że zakresy zdefiniowane przez ip_start i ip_end nigdy się nie nakładają.

Problem z twoim pierwotnym podejściem polega na tym, że mysql, nie wiedząc o tym ograniczeniu, może użyć indeksu tylko do określenia, gdzie rozpocząć lub zatrzymać skanowanie, którego (myśli) potrzebuje, aby znaleźć wszystkie dopasowania dla twojego zapytania.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dostęp do danych z serwletu

  2. mysql wybierz złącze wewnętrzne z limitem

  3. SQL Random wiersze w dużej tabeli (z klauzulą ​​where)

  4. Pobierz hierarchię rodzic-dziecko z samoodnoszącej się tabeli mysql

  5. Praca z bazami danych MySQL cPanel