programing

왼쪽 와일드카드 문의 Marriadb 인덱스

randomtip 2022. 9. 13. 21:58
반응형

왼쪽 와일드카드 문의 Marriadb 인덱스

나는 이 문제에 대해 며칠째 머리를 긁적거리고 있다.이렇게 어렵진 않을 텐데 아직 답을 못 찾았어요

데이터는 다음과 같습니다. +---------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+--------------+------+-----+---------+-------+ | name | varchar(255) | NO | | NULL | | | email | varchar(255) | NO | MUL | NULL | | | ip | varchar(255) | NO | | NULL | | | username| varchar(255) | NO | | NULL | | +---------+--------------+------+-----+---------+-------+

와일드카드가 LIKE 문의 선두에 있기 때문에 다음 쿼리는 인덱스를 바이패스합니다.

SELECT * FROM db WHERE email LIKE '%@hotmail.com';

인덱스는 처음에 시작되므로 이 쿼리는 인덱스를 사용합니다.

SELECT * FROM db WHERE email LIKE 'first.last@%';

다음 질문입니다.두 번째 열을 만들지 않고도 "LIKE %@hotmail.com"과 같은 문장에 인덱스를 사용할 수 있도록 오른쪽에서 시작하는 인덱스를 만드는 방법이 있어야 합니다.

일반 B 트리 인덱스는 항상 문자열 값을 왼쪽에서 오른쪽으로 인덱싱합니다.오른쪽에서 왼쪽으로 색인화할 수 있는 옵션은 없습니다.

지금까지 살펴본 회피책 중 하나는 문자열 복사본을 저장할 다른 열을 만들고, 복사본을 반전시킨 다음 인덱싱하는 것입니다.

MariaDB 및 MySQL 5.7에도 가상 열이 있습니다.가상 열을 인덱싱할 수 있습니다.따라서 가상 컬럼을 일반 이메일컬럼의 REVERSE()로 정의하고 인덱스를 붙일 수 있습니다.

이 경우 이메일 이름과 이메일 도메인을 별도로 검색해야 하는 경우 이메일 주소의 두 구성 요소를 별도의 열에 저장하고 각각 인덱싱할 수 있습니다.

언급URL : https://stackoverflow.com/questions/44703834/marriadb-index-for-left-wildcard-statement

반응형