programing

범위의 MariaDB/MySQL 조인 테이블

goodsources 2023. 7. 10. 22:17
반응형

범위의 MariaDB/MySQL 조인 테이블

IP 주소가 포함된 테이블이 있습니다.

create table login_history
(
    id         int auto_increment primary key,
    ip         int unsigned,
    created    datetime(6)  not null,
    user_id    int unsigned not null,
);

및 IP 범위가 있는 다른 테이블:

create table ip2location
(
    ip_from      int unsigned not null primary key,
    ip_to        int unsigned null,
    country_code char(2)      null,
)

다음과 같은 "on" 표현으로 두 테이블을 모두 결합하려고 합니다.

select * from login_history
left join ip2location_db1  on
    ip2location_db1.ip_from <= login_history.ip_int and ip2location_db1.ip_to >= login_history.ip_int

잘 작동하고 있지만, 매우 느립니다.어떻게 하면 이러한 쿼리의 성능을 향상시킬 수 있습니까?저는 이미 두 테이블의 IP 열에 인덱스를 추가했습니다.

도와주셔서 고맙습니다.좋은 하루 보내세요!

한 가지 가능성은 다음과 같습니다.

select lh.*,
       (case when ip.ip_from <= lh.ip_int then ip.country)
from (select lh.*,
             (select ip.ip_from
              from ip2location_db1 ip
              where ip_to >= lh.ip_int
              order by ip_to
              limit 1
             ) as ip_to
      from login_history lh
     ) lh left join
     ip2location_db1 ip
     on ip.ip_to = lh.ip_to;

그러면 다음의 인덱스를 활용할 수 있습니다.ip2location_db1(ip_to).

언급URL : https://stackoverflow.com/questions/65022630/mariadb-mysql-joining-tables-on-a-range

반응형