2016-12-29 7 views
0

테이블이 있고 열 중 하나가 TEXT 유형입니다. 주어진 문자열과 비슷한 텍스트가있는 행을 검색해야합니다.MySQL : 쿼리로 시작하는 TEXT 필드가있는 행을 검색합니다.

문자열이 꽤 길어서 (10000 바이트라고 가정 해 봅시다) 문자열의 처음 20 바이트 만 비교하는 것으로 충분하다고 판단했습니다. 내가 넣어

SELECT * FROM `table` WHERE STRCMP(SUBSTRING(`description`,0,20),'string_to_compare') = 0 

또는

SELECT * FROM `table` WHERE `description` LIKE 'string_to_compare%') 

참고 :

KEY `description` (`description`(20)) 

그래서 내가 지금 무엇을 원하는 다음 쿼리 중 하나입니다 : 내가 키를 생성 빨리이 검색을 수행하려면 끝에 하나의 백분율 기호 string_to_compare DB에 첫 번째 바이트 만 비교한다고 말하면됩니다.

MySQL의 두뇌가 키를 사용하고 여분의 움직임을하지 않기를 바란다.

질문 :

  1. 쿼리가 더 나은 어떤 차이가 있나요? DB 엔진 (MyISAM)이 더 명확하게 이해할 수 있도록 개인적으로 두 번째를 선호합니다.
  2. MyISAM이 이러한 쿼리에 대해 효율적인 코드를 작성한다는 것이 맞습니까?
  3. PDO의 prepare 문에 '%'를 어떻게 삽입합니까? SELECT * FROM table WHERE description LIKE ":text%"?
+1

MyISAM이 죽어 가고 있습니다; 그것을 사용하지 마십시오. –

+0

고마워, @RickJames –

답변

1
  1. 네, 차이가 있습니다. WHERE 조건이 열 값에 대한 함수를 호출하면 인덱스를 사용할 수 없습니다. 나는 당신의 SUBSTRING() 호출이 텍스트의 색인 된 부분과 일치하고 그것을 사용한다는 것을 깨닫게 될 것이라고 생각하지 않습니다. 반면에 LIKE은 인덱스를 사용할 수있는 경우를 인식하도록 특별히 코딩되어 있습니다. 또한 두 문자열을 비교하려는 경우 이 아니라 =을 사용해야합니다.

    WHERE SUBSTRING(`description`,1,20) = 'string_to_compare' 
    
  2. 나는 그것이 LIKE 버전을위한 효율적인 쿼리를 만들 것입니다 생각합니다.

  3. 자리 표시자는 따옴표로 묶을 수 없습니다. 을 사용하여 결합하십시오 : WHERE description LIKE CONCAT(:text, '%'). 또는 %을 자리 표시 자에 바인딩하는 PHP 변수의 끝에 넣고 WHERE description LIKE :text을 사용할 수 있습니다.
+0

정말 고마워! STRCMP() 함수 대신 '='을 사용해야하는 이유에 대해 의견을 말씀해 주시겠습니까? –

+1

의도가 무엇인지 간략하고 명확 해 졌기 때문에 주로. 그것은 또한 더 잘 최적화 될 수도 있습니다. 단일 표현식에서 상위, 하위 또는 동일을 구별 할 필요가있을 때'STRCMP()'를 사용하십시오. – Barmar