2010-01-14 2 views
0

조금 비싸다고 걱정됩니다.누구나보다 최적화 된 SQL 솔루션을 찾을 수 있습니까?

플러스 나는 조만간 태그에 대한 정규화 된 시스템을 구현할 예정이므로 추가 조인이있게 될 것입니다.

그 중 4 개의 테이블 (tbl_videos, tbl_articles, tbl_galleries 및 tbl_users) 중 각각 3 개의 결과를 표시하므로 '검색'을 한 번 눌러 쿼리를 네 번 실행해야합니다.

SELECT *, 
(
(CASE WHEN `description` LIKE '%hotel%' THEN 1 ELSE 0 END) + 
(CASE WHEN `description` LIKE '%london%' THEN 1 ELSE 0 END) + 
(CASE WHEN `description` LIKE '%lazy%' THEN 1 ELSE 0 END) + 
(CASE WHEN `description` LIKE '%dog%' THEN 1 ELSE 0 END) + 

(CASE WHEN `title` LIKE '%hotel%' THEN 1 ELSE 0 END) + 
(CASE WHEN `title` LIKE '%london%' THEN 1 ELSE 0 END) + 
(CASE WHEN `title` LIKE '%lazy%' THEN 1 ELSE 0 END) + 
(CASE WHEN `title` LIKE '%dog%' THEN 1 ELSE 0 END) + 

(CASE WHEN `tags` LIKE '%hotel%' THEN 1 ELSE 0 END) + 
(CASE WHEN `tags` LIKE '%london%' THEN 1 ELSE 0 END) + 
(CASE WHEN `tags` LIKE '%lazy%' THEN 1 ELSE 0 END) + 
(CASE WHEN `tags` LIKE '%dog%' THEN 1 ELSE 0 END) 

) AS relevance 
FROM `table` 
WHERE `description` LIKE '%hotel%' 
    OR `description` LIKE '%london%' 
    OR `description` LIKE '%lazy%' 
    OR `description` LIKE '%dog%' 
    OR `title` LIKE '%hotel%' 
    OR `title` LIKE '%london%' 
    OR `title` LIKE '%lazy%' 
    OR `title` LIKE '%dog%' 
    OR `tags` LIKE '%hotel%' 
    OR `tags` LIKE '%london%' 
    OR `tags` LIKE '%lazy%' 
    OR `tags` LIKE '%dog%' 
ORDER BY relevance DESC 
LIMIT 0 , 3; 
+0

당신이 해결하려고하는 문제는 무엇인가 ... 갈이 및 쿼리 옵티마이 그것을 좋아하는 방법을 참조, 그냥 주어진 검색어에 대한 데이터베이스를 검색하는 것입니다? 프로세스는 무엇입니까? 사용자가 검색 상자에 데이터를 입력 한 다음 어떻게됩니까? –

+0

그냥 표준 검색, 예. 그런 다음 페이스 북처럼 각 카테고리의 x 번호 목록이 표시됩니다. 내 경우 3 명의 사용자, 3 개의 기사, 3 개의 비디오 및 3 개의 갤러리가 결과로 표시됩니다. – Mark

+0

예를 들어 사용자가 "hotel london lazy dog"를 검색 했습니까? –

답변

1

네, 아마도 리소스가 많을 것 같지만 쿼리를 제출하기 전에 비즈니스 계층이 앞에있는 것 같습니다.

검색어를 파싱하거나 사용자에게 설명, 제목 및 태그에 대한 별도의 입력란을 제공하고 직접 작성하기 위해 검색어를 적절히 구성하여 자신이 할 수있는 것과 달성 할 수있는 것에 대해 생각해보십시오. "이 표의 열 어딘가에이 검색어와 매우 유사한 데이터가 있습니다."라고 효과적으로 말하기보다는 검색어를 사용하는 것이 좋습니다.

일단 비즈니스 로직을 정하면 (위의 쿼리가 어떻게 끝날지라도 의심 스럽지만 그럼에도 불구하고) Explain 계획을 통해 쿼리를 실행하고 어디에서 선택해야하는지 확인해야합니다 데이터베이스를 따라갈 수있는 인덱스를 작성하십시오.

편집 :

좋아, 방법을 제안

select matched_val, relevance from (
    select description as matched_val, count(*) as relevance 
    from table 
    where description like '%hotel%' 
    or description like '%london%' 
    or description like '%lazy%' 
    or description like '%dog%' 
    group by description 

    union all 

    select title as matched_val, count(*) as relevance 
    from table 
    where title like '%hotel%' 
    or title like '%london%' 
    or title like '%lazy%' 
    or title like '%dog%' 
    group by title 

    union all 

    select tags as matched_val, count(*) as relevance 
    from table 
    where tags like '%hotel%' 
    or tags like '%london%' 
    or tags like '%lazy%' 
    or tags like '%dog%' 
    group by tags 
) as a 
order by a.relevance desc 
LIMIT 0 , 3 
이있어 이 적어도 당신은 오히려 조건보다 스위치 문에서 한 번 일치처럼 할 필요가 의미

, 더하기 옵티 마이저는 설명, 제목 및 태그 (자신을 추가해야 함)에 색인을 사용할 수 있으므로 멀리 있어야합니다.

+0

흠, 나는 다음과 같은 오류 '모든 파생 테이블은 자신의 별명을 가지고 있어야합니다'얻을 : : S가 좋은, 그렇지 않으면 – Mark

+0

당신은 같은 것을 할 필요가 있습니다 ... 더 포맷 버전을 내 최신 편집을 참조하십시오 같은데 a.relevance 내림차순 제한 0, 3 내가 MySQL을 사용하지 적이하여 순서와 (그 노동 조합 --all )에서 matched_val, 관련성을 선택,하지만 당신은 SQL 서버 –

+0

와우에 그렇게 할 것입니다. .. 오류는 없지만, 0.0006에 비해 20 행에 0.0554 초가 훨씬 비쌉니다. 그 결과는 틀립니다. 각 하위 쿼리가 하나의 큰 쿼리에 대해 4 개의 쿼리와 같은 쿼리이기 때문에 더 효율적일 수는 없다고 생각합니다. 어쨌든 고맙습니다. – Mark

관련 문제