왼쪽 와일드카드 문의 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()로 정의하고 인덱스를 붙일 수 있습니다.
- https://mariadb.com/kb/en/mariadb/virtual-computed-columns/
- https://dev.mysql.com/doc/refman/5.7/en/create-table-generated-columns.html
이 경우 이메일 이름과 이메일 도메인을 별도로 검색해야 하는 경우 이메일 주소의 두 구성 요소를 별도의 열에 저장하고 각각 인덱싱할 수 있습니다.
언급URL : https://stackoverflow.com/questions/44703834/marriadb-index-for-left-wildcard-statement
'programing' 카테고리의 다른 글
MySql 오류: 1364 필드 'display_name'에 기본값이 없습니다. (0) | 2022.09.13 |
---|---|
Python을 사용하는 Selenium - Geckodriver 실행 파일이 PATH에 있어야 합니다. (0) | 2022.09.13 |
데이터베이스/SQL: 경도/위도 데이터 저장 방법 (0) | 2022.09.13 |
Selenium Webdriver 2 Python에서 현재 URL을 얻으려면 어떻게 해야 하나요? (0) | 2022.09.13 |
MySQL 루트 사용자의 모든 권한을 복원하려면 어떻게 해야 합니까? (0) | 2022.09.13 |