복붙노트

[SQL] 와일드 카드 검색 성능 (%%)를 향상 MYSQL

SQL

와일드 카드 검색 성능 (%%)를 향상 MYSQL

아래 이메일로 사람을 검색하기위한 질의 I 사용은

  SELECT *
    FROM phppos_customers
    JOIN phppos_people ON phppos_customers.person_id = phppos_people.person_id
   WHERE deleted = 0
     AND email LIKE '%f%'
ORDER BY email ASC

쿼리까지 "이메일"속도에 인덱스를 추가 할 것인가?

해결법

  1. ==============================

    1.아니, MySQL은 당신이 최고의 와일드 카드가있을 때 인덱스를 사용 할 수 없습니다 때문입니다. 당신이 'F %'에 LIKE를 변경 한 경우, 다음 인덱스를 사용할 수있을 것입니다.

    아니, MySQL은 당신이 최고의 와일드 카드가있을 때 인덱스를 사용 할 수 없습니다 때문입니다. 당신이 'F %'에 LIKE를 변경 한 경우, 다음 인덱스를 사용할 수있을 것입니다.

  2. ==============================

    2.LIKE의 인수가 (% F %) 와일드 카드 문자 %로 시작하기 때문에 아니, MySQL은 인덱스를 사용하지 않습니다. 이 상수로 시작하면, 인덱스가 사용됩니다.

    LIKE의 인수가 (% F %) 와일드 카드 문자 %로 시작하기 때문에 아니, MySQL은 인덱스를 사용하지 않습니다. 이 상수로 시작하면, 인덱스가 사용됩니다.

    더 많은 정보 : 7.5.3. MySQL은 인덱스를 사용하는 방법

  3. ==============================

    3.하나는 이메일 열에 존재하면 인덱스가 사용될 수 없다는 LIKE 동작 보장하지만 왼쪽을 와일드 카드.

    하나는 이메일 열에 존재하면 인덱스가 사용될 수 없다는 LIKE 동작 보장하지만 왼쪽을 와일드 카드.

    전체 텍스트 검색 (FTS)는 SQL을 통해 텍스트 내에서 문자열을 찾기위한 선호하는 구문입니다. MySQL은 MATCH / 반대 구문을 사용하여 기본 FTS의 기능이 있습니다 (아래 v.5.5의의 MyISAM 엔진을 사용하고 테이블을 필요로 InnoDB의 FTS가 v.5.6 + 지원됩니다.)

      SELECT c.*, p.*
        FROM PHPPOS_CUSTOMERS c
        JOIN PHPPOS_PEOPLE p ON p.person_id = c..person_id
       WHERE deleted = 0
         AND MATCH(email) AGAINST('f')
    ORDER BY email 
    

    그러나 그러한 스핑크스와 같은 타사 FTS 기술이있다.

  4. ==============================

    4.여기에 내 게시물에서 나는, 구체적으로, 당신은 몇 가지 추가 스토리지의 비용으로, 빠른 % 중위 % 검색 등으로 인덱스를 사용 할 수있는 방법을 설명합니다 :

    여기에 내 게시물에서 나는, 구체적으로, 당신은 몇 가지 추가 스토리지의 비용으로, 빠른 % 중위 % 검색 등으로 인덱스를 사용 할 수있는 방법을 설명합니다 :

    https://stackoverflow.com/a/22531268/543814

    긴 문자열이 상대적으로 작고, 저장 요건은 일반적으로 허용된다.

    구글에 따르면, 평균 이메일 주소는 25 자입니다. 이것은 평균 요인 12.5하여 필요한 저장을 증가하고 당신에게 대가로 빠른 색인 검색을 제공합니다. (계산을 위해 내 게시물을 참조하십시오.)

    당신이 10'000 전자 메일 주소를 저장하는 경우 내 관점에서, 당신은 잘도 100'000 전자 메일 주소에 대해 저장 (에 해당)이어야한다. 이것은 당신이 인덱스를 사용할 수 있도록하는 데 걸리는 경우, 그 허용 트레이드 오프처럼 보인다. 비 인덱스 검색이 감당할 수있는 동안 종종, 디스크 공간이 저렴합니다.

    당신이이 방법을 선택하면, 당신이 64 자에 전자 메일 주소의 입력 길이를 제한하는 것이 좋습니다. 같은 길이의 드문 (또는 공격자) 전자 메일 주소는 32 배 일반적인 스토리지까지 필요합니다. 이것은 당신을 제공합니다 :

    너무 가혹한 요구 사항 64자를 고려하면, 127.5의 최악의 경우 스토리지 증가 요인에 대해, 대신 255을 사용합니다. 어리석은? 혹시. 아마도? 제 빨리? 대단히.

  5. ==============================

    5.당신은 모든 사람들이 (처음에 %에 대해) 말한다처럼 LIKE로 빠르게 만들 수 없습니다,하지만 당신은 당신이 먼저 사람을 필터링 이후에 가입하여 조금을 향상시킬 수 있습니다.

    당신은 모든 사람들이 (처음에 %에 대해) 말한다처럼 LIKE로 빠르게 만들 수 없습니다,하지만 당신은 당신이 먼저 사람을 필터링 이후에 가입하여 조금을 향상시킬 수 있습니다.

    SELECT *
      FROM (SELECT * 
              FROM `phppos_customers`
             WHERE `deleted` = 0
               AND  `email`  LIKE '%f%') `t_customers`
      JOIN `phppos_people` ON `t_customers`.`person_id`=`phppos_people`.`person_id`
     ORDER BY `email` asc
    
  6. ==============================

    6.나는 어떻게 OUTSMART MySQL을로 알고 인덱스가 왼쪽 측면에서 경우에도 와일드 카드 검색을 검색 할 수 있습니다. 다만, (그것을 인덱스 만들기) 역 또한 검색 문자열을 당신의 열의 반대의 열을 생성하고, 인덱스를 지원하고 오른쪽에서 와일드 카드를 사용할 ..

    나는 어떻게 OUTSMART MySQL을로 알고 인덱스가 왼쪽 측면에서 경우에도 와일드 카드 검색을 검색 할 수 있습니다. 다만, (그것을 인덱스 만들기) 역 또한 검색 문자열을 당신의 열의 반대의 열을 생성하고, 인덱스를 지원하고 오른쪽에서 와일드 카드를 사용할 ..

    그래서 당신은 DB 단어 "slibro"에있는 당신은 "orbil의 %"를 "orbils"를 포함하고 검색 될 것입니다 반전 열을 생성 "%의 책"을 검색합니다.

    PS :하지만 어떻게하지만 "% X %"빠른 전체 와일드 카드 검색을 수행하는 솔루션이 없습니다 :).

  7. from https://stackoverflow.com/questions/5905125/mysql-improve-search-performance-with-wildcards by cc-by-sa and MIT license