programing

특정 다른 열 값에 대해서만 한 열에 대한 색인

projobs 2022. 10. 2. 15:10
반응형

특정 다른 열 값에 대해서만 한 열에 대한 색인

테이블 로그가 있는데, 특히 두 개의 필드가 있습니다.action(VARCHAR 45) 및info(VARCHAR 10000).

이 테이블에는 여러 항목이 기록되어 있으며, 그 중 하나가 페이지를 방문했을 때의 사용자 IP입니다.이 경우action='ip',info='IP.ADD'.RE.SS.

왜냐면info특정 사항에 대해 많은 양의 텍스트를 기록할 수 있습니다. 저는 다음 작업에만 사용할 수 있는 인덱스를 만들고 싶습니다.info에 참가하다.action='ip'만 있으면 IP를 빠르게 검색할 수 있고 "actions"가 포함된 인덱스가 너무 커지지 않습니다.

저는 이미 처음 15글자에 대해 INDEX를 작성하려고 했습니다만, 그래도 IP 엔트리가 전체의 1% 정도이기 때문에, 저는 조금 오버킬을 하고 있는 것 같습니다.이 솔루션 전체가 다른 사람으로부터 상속되었습니다.아키텍처 전체를 변경하기 위해 현재 할 수 있는 일은 거의 없습니다.

어떻게 하면 제대로 할 수 있는지 조언해 주실 수 있나요?그게 가능하기나 해?

일부 RDBMS 제품은 귀하가 설명한 내용을 지원합니다.다른 제품에서는 부분 인덱스 또는 필터링된 인덱스라고 합니다.

MySQL은 이 아이디어를 구현하지 않습니다(비표준 기능이기 때문에 구현할 의무는 없습니다).새로운 기능으로서 이 기능에 대한 요구가 있었습니다.https://bugs.mysql.com/bug.php?id=76631

MySQL 5.7에서 부분 인덱스를 시뮬레이트하기 위해 수행할 수 있는 회피책 중 하나는 가상 컬럼을 작성하는 것입니다.가상 컬럼의 값은 NULL입니다.다만, 다음의 경우는 예외로 합니다.action'ip'입니다.그런 다음 해당 가상 열을 인덱싱합니다.

ALTER TABLE logs
  ADD COLUMN ip_info VARCHAR(12) 
    AS (CASE `action` WHEN 'ip' THEN LEFT(info, 12) END),
  ADD KEY (ip_info);

엄밀히 말하면, 모든 행을 인덱싱하지만, 적어도 작업이 'ip'인 경우를 제외하고는 인덱스에 사용자의 값을 저장하지 않습니다.

추신: 위의 예시는 테스트하지 않았으므로 구문 오류가 있으면 사과드립니다.

이것은 「EAV」의 카테고리에 속하는 것 같습니다.여러 가지(ip, postdel 등)가 있으며, 각각은 옵션입니다.색인이 필요한 것도 있고 필요하지 않은 것도 있습니다.

권장되는 것은 키와 값의 쌍을JSON스트링인덱싱하려는 모든 항목에 대해 특수 열을 만듭니다(예: IP).그럴 수 있다.NULLable최소화할 수 있습니다(단, 완전히 제거되는 것은 아닙니다).

EAV에 관한 블로그도 참조해 주세요.

JSON과 관련된 MySQL 및 MariaDB의 구현을 참조하십시오.주의: 비교적 새로운 버전의 MySQL 또는 MariaDB가 필요합니다.

어쨌든 작업 열에서 필터링하고 있으므로 결합된 인덱스가 해결책입니다. .(action, info(15)).

그러나 인덱스의 열 순서는 중요합니다.반대로 바꾸지 마세요.

언급URL : https://stackoverflow.com/questions/46317835/index-for-one-column-only-for-specific-other-column-value

반응형