1
(start_date, end_date, description)
(start_date, end_date, description)
테이블을 가지고 있습니다 - 주어진 기간 내에 발생하는 이벤트를 찾기 위해
SELECT *
FROM table
WHERE start_date < $view_end AND end_date > $view_start
이 작업은 올바르게 작동하며 많은 데이터베이스 제품은 두 컬럼 모두에서 인덱스를 사용할 수 있습니다. 효율적으로 결과를 찾을 수 있지만 SQLite는 한 번에 하나의 범위 인덱스 만 사용할 수 있습니다 (색인 된 같음 비교를 많이 수행 할 수 있지만 더 큰 것보다 작은 것 또는 작은 것만 인덱싱 할 수 있음). 결과적으로 백만 개의 테이블에서 중간 10 개의 이벤트를보고 싶다면 하나의 인덱스 만 사용하여 그 중 절반을 제거하고 나머지는 50 만 개의 전체 테이블 스캔을 수행해야합니다.
SQLite의 제한 사항을 고려할 때 효율적인 방식으로이 쿼리를 다시 작성할 수있는 멋진 트릭이 있습니까?
원래 쿼리에는 $ view_start 이전에 시작하는 레코드가 포함되어 있지만 쿼리에는 포함되지 않습니다. – Jeff
@Jeff, 필자의 쿼리가 포스터와 다르다는 것을 잘 알고있다.'$ view_start'가'$ view_end'보다 작고'start_date'가'end_date'보다 작다는 가정에 기반하고있다. 그렇지 않다면 전적으로 합리적인 가정이라고 생각합니다. 이제 대신 OP 쿼리에 없었던'start_date = $ view_end' 레코드를 포함시킬 수 있었지만 가독성을 위해 방금 완료 했으므로 쉽게 start_date> $ view_start가되고 start_date <$ view_end가됩니다. '대신 원하는 경우 올바르게 색인을 사용합니다. – Seph
이것은 더 빠르지 만,보기 시작과보기 끝 사이에/어떤/자신의 일부가있는 이벤트가 필요합니다. ( – Shish