2012-08-08 3 views
0

안녕. 어느 것이이 mysql select 문의 where 조건을 단순화 할 수 있습니까? 결과를 가져 오는 데 시간이 오래 걸리거나 SET SQL_BIG_SELECTS = 1을 묻습니다. 아래 쿼리 어느 것이이 mysql select의 where 조건을 단순화 할 수 있습니까

:

우편가 SW10BH12 또는 와 같은 값을 포함

* 표시 req_area * 포함 켄싱턴 첼시, SW10,

같은 데이터

영역의 값은 입니다. Kensington and Chel 바다,

* town_area *는 웨스트 브롬톤, 첼시와 같은 값을 가짐.

select `a`.`user_id` AS `user_id`,`a`.`req_area` AS `req_area`,`a`.`req_area2` AS `req_area2`,`a`.`req_area3` AS `req_area3`, 
`a`.`req_property_type` AS `req_property_type`,`a`.`req_bedrooms` AS `req_bedrooms`,`b`.`latitude` AS `latitude`, 
`b`.`longitude` AS `longitude`,`b`.`postcode` AS `postcode` 
from (`cff_user_property_req_view` `a` join `cff_uk_short_postcodes` `b`) 
where 
(`b`.`postcode` regexp concat("'",TRIM(`a`.`req_area`),'|',TRIM(`a`.`req_area2`),'|',TRIM(`a`.`req_area3`),"'")>=1 or 
`b`.`region` regexp concat("'",TRIM(`a`.`req_area`),'|',TRIM(`a`.`req_area2`),'|',TRIM(`a`.`req_area3`),"'")>=1 or 
`b`.`town_area` regexp concat("'",concat('[[:<:]]',`a`.`req_area`,'[[:>:]]'),'|',concat('[[:<:]]',`a`.`req_area2`,'[[:>:]]'),'|',concat('[[:<:]]',`a`.`req_area3`,'[[:>:]]'),"'")>=1) 
order by `a`.`user_id`; 

미리 감사드립니다.

답변

1

이렇게 느린 이유는 코드에서 두 테이블의 전체 외부 제품에 대한 세 가지 정규식을 평가해야하기 때문입니다. 정규 표현식은 느리고 일치하는 행을 찾기 위해 전체 테이블을 거쳐야하는 모든 것도 느립니다. 주어진 쿼리의 정확한 의미를 유지하면서 할 수있는 일은 거의 없습니다.

그런 쿼리를 개선 할 방법을 묻는 대신, 당신이 달성하고자하는 것이 무엇인지 설명하고 더 나은 방법으로 모델링하는 방법을 찾을 수 있습니다. 전체 텍스트 검색 색인이 도움이 될 수 있습니다. 열을 단어로 분할하고 이러한 단어를 여분의 표에 저장하면 도움이 될 수 있습니다. 나는 당신의 질문을 편집하는 것이 더 낫지 않겠는가, 아니면 지금 당장이 질문을 남기고, 완전히 새로운 질문을 할 것인지는 잘 모르겠습니다.

일치하는 것으로 예상되는 경우 req_area의 모양을 보여 주어야합니다. req_area 필드는 항상 정규 표현식에 포함되므로 "Kensington and Chelsea, SW10"의이 req_area은 예제의 다른 값에 포함되지 않으므로 일치하지 않습니다. sqlfiddle을 사용하여 실제 예제를 제공하면 다른 사람들이 가능한 쿼리를 실험하기가 쉬워 져서 쿼리 결과를 실제로 확인한 결과와 사용자가 답변 할 가능성이 높아집니다. 실험을 통해 답변을 개발하십시오.)