현재 데이터베이스 시스템 (예 : MySQL 또는 Postgres)에서 LIKE 연산자가 어떻게 구현되는지 설명 할 수 있습니까? 또는 그것을 설명하는 참고 문헌을 알려주십시오.
순진한 접근 방식은 각 레코드를 검사하여 관심있는 분야에서 정규 표현식 또는 부분 문자열 일치를 실행하는 것이지만 이러한 시스템이 더 똑똑한 일이라고 생각합니다.
답변
아뇨, 그건 그들이하는 일과 거의 같습니다. 이제 선행 와일드 카드가없고 필드가 색인화되는 경우 (일반적인 상황) 데이터베이스 엔진은 정규식을 색인에 적용 할 수 있습니다. 예를 들어
SELECT *
FROM employees
WHERE last_name LIKE 'Cav%'
데이터베이스는 색인 on LAST_NAME
을 사용하여 성이 ‘Cav’로 시작하는 모든 행을 찾을 수 있습니다 . 반면에, 당신이 같은 것을 가지고 있다면
SELECT *
FROM employees
WHERE last_name LIKE '%av%'
데이터베이스는 전체 테이블 (또는 전체 인덱스)을 스캔하고 전체 LAST_NAME
값 과 비교하여 표현식을 평가해야 합니다. 분명히, 그것은 매우 비싸다.
더 나은 관계형 데이터베이스는 대부분 서로 다른 종류의 인덱스와 텍스트 카탈로그를 구성하여보다 효율적인 방식으로 전체 텍스트 검색을 수행 할 수있는 기능이 있지만 LIKE 키워드는 사용하지 않습니다. 예를 들어, PostgreSQL의 전체 텍스트 검색에 대해 설명하는 좋은 기사가 있습니다.
답변
저스틴 동굴 쓴뿐만 아니라, 이후 PostgreSQL의 9.1 당신이 속도를 높일 수 있는 과 검색 LIKE
( ~~
) 또는 ILIKE
( ~~*
도), 기본 정규 표현식 일치 ( ~
). pg_trgm 모듈 이 GIN 또는 GiST 인덱스와 함께 제공하는 연산자 클래스를 사용하여 LIKE
고정되지 않은 표현식의 속도를 높 입니다. 확장을 설치하려면 데이터베이스마다 한 번씩 실행하십시오.
CREATE EXTENSION pg_trgm;
양식의 색인 작성
CREATE INDEX tbl_col_gin_trgm_idx ON tbl USING gin (col gin_trgm_ops);
또는:
CREATE INDEX tbl_col_gist_trgm_idx ON tbl USING gist (col gist_trgm_ops);
GIN 또는 GiST 인덱스를 생성하고 유지 관리하는 데는 비용이 들지만 테이블을 많이 쓰지 않으면 큰 기능입니다.
Depesz 는 그의 블로그에서 새로운 기능에 대한 훌륭한 기사 를 작성했습니다 .
GIN 또는 GiST?
매뉴얼 의이 두 인용문은 약간의 지침을 제공해야합니다.
GiST와 GIN 색인 사이의 선택은 다른 곳에서 논의되는 GiST와 GIN의 상대적인 성능 특성에 따라 다릅니다. 일반적으로 GIN 인덱스는 GiST 인덱스보다 검색 속도가 빠르지 만 빌드 또는 업데이트 속도가 느립니다. 따라서 GIN은 정적 데이터에 더 적합하고 GiST는 자주 업데이트되는 데이터에 더 적합합니다.
그러나 거리 연산자를 사용하는 “가장 가까운 이웃”유형의 쿼리의 경우 <->
:
이것은 GiST 인덱스가 아닌 GiST 인덱스에 의해 매우 효율적으로 구현 될 수 있습니다.
답변
MySQL에 대해 말하면 와일드 카드 문자 (%)의 위치가 달라집니다. 텍스트의 첫 번째 부분 where first_name like 'Sta%'
이처럼 지정 되면 DB 엔진은 S로 시작하고 St로 이동 한 다음 Sta로 이동하는 단어의 작은 하위 집합 만 검색 where first_name like '%stan%'
합니다. 열이 필요합니다. 또한 자연어 검색을 수행하는 전체 텍스트 인덱스를 살펴볼 수도 있습니다. 여기에서 MySQL 문서를 확인하십시오.