열이 문자열 접두사를 포함하는 MySQL 테이블이 있습니다. 예를 들어이 접두사는 유닉스 파일 시스템의 최상위 디렉토리 수 :MySQL : 열의 내용이 문자열의 시작 부분 인 행을 효율적으로 찾습니다.
my_table:
+---------+
| prefix |
+---------+
| /usr/ |
| /bin/ |
| /var/ |
| /lib/ |
+---------+
접두사 열의 값이 시작 어디 효율적이 테이블의 모든 행을 찾는 쿼리를 작성할 수있는 방법 주어진 끈? 문자열을 주어진 예를 들어
'는/usr/빈/고양이' 나는 '는/usr/빈/고양이의 시작입니다'는/usr/'을 을 포함하는 행을 찾는 쿼리를 작성하는 방법 '.
내 첫번째 추측은 LIKE
이 방법을 사용하는 것입니다
SELECT * FROM my_table
WHERE '/usr/bin/cat' LIKE CONCAT(prefix, '%')
을하지만이 쿼리는 내가 접두사 열이 인덱스를 사용하지 않을 두려워.
은 또한 다음과 같은 내놓았다 : 같거나 즉시 사전 식 순서 '는/usr/빈/고양이' 이전의 접두사를 검색SELECT * FROM my_table
WHERE prefix <= '/usr/bin/cat' ORDER BY prefix DESC LIMIT 1
합니다. 그런 다음 접두어이 실제로는 '/ usr/bin/cat'으로 시작하는지 여부를 확인할 수 있습니다.
하지만 단 한 행으로 만 작동하며 이것이 최적의 솔루션인지 궁금합니다.
편집 : 나는 예를 들어 루트 디렉토리를 사용하지만 나뿐만 아니라 임의의 문자열을 처리 할 수있는 방법이 있는지 알고 싶습니다. 아마도 이러한 문자열에는 경로 구분 기호가 포함되지 않거나 접두사가 여러 수준으로 깊어 질 수 있습니다. '/ usr/lib'라고 말하십시오.
편집 : 내 두 번째 쿼리가 가짜 인 것 같습니다. '/ usr /'는 '/ usr/bin/cat'보다 작지만 '/ usr/a'도 마찬가지입니다. 이 쿼리는 여전히 대형 테이블에서 전체 테이블 스캔보다 훨씬 빠르지 만 실제로는 첫 번째 실제 접두사를 찾을 때까지 더 많은 행을 가져와야합니다.
그래서 인덱스가 이런 종류의 접두사 검색에 도움이 될 수 있지만 여전히 그것을 활용하는 최선의 방법을 모릅니다.
에 대해 생각 후 * 덜 나보다 큰 * 솔루션 조금 더 당신이 상호 독점 접두사를 가지고 있지만 그것은 파일 시스템 경로의 경우 완벽한 대답 적은 다른 경우 –