2011-09-30 4 views
0

아래의 SQL 쿼리를 참조하십시오 - 우편 번호, 회사 이름 또는 도시 (위치)별로 상점을 검색 할 수 있습니다 ... 프론트 엔드 웹 사이트에는 검색이 하나만 있습니다 드롭 다운 검색 유형이없는 텍스트 상자.쿼리 성능 : 우편 번호, 회사 이름 또는 마을 검색

shop_options.live이 1이고 어느 날 영업 시간에 따라 달라지는 경우에만 결과가 표시됩니다 : O_Hour.weekday = '5' (금).

S_D.postcode (예 : S_D.postcode = 'L14')으로 검색하면 shop_delivery_area 테이블에서 L14를 찾은 다음 해당 우편 번호에서 상점 목록을 표시합니다.

SELECT distinct S.*, S.company, S.street, S.town FROM shop as S 
    JOIN shop_delivery_area as S_D on S_D.shopID = S.shopID 
    JOIN shop_options on shop_options.shopID = S.shopID 
    JOIN shop_opening_hours as O_Hour on O_Hour.shopID = S.shopID 
WHERE (S_D.postcode = 'Liverpool' OR S.company LIKE 'Liverpool' OR S.town LIKE 'Liverpool') 
AND shop_options.live = '1' AND O_Hour.weekday = '5' 
    ORDER BY O_Hour.opentime 

쿼리가 작동하지만 속도가 매우 느립니다. 결과를 얻기 위해 거의 일초. 어떻게 성능을 더 빨리 향상시킬 수 있습니까?

편집 : 고정 SQL 쿼리.

+0

얼마나 많은 데이터가 있습니까? 색인? – michael667

+0

shop (1,200), shop_delivery_area (5000), shop_options (1200), shop_opening_hours (8000) 행 ... 인덱스하지 않았습니다. –

+1

EXPLAIN으로 이미 작업하셨습니까? http://dev.mysql.com/doc/refman/5.0/en/explain.html 모든 테이블에 이미 ID 열이 있으므로 색인이 도움이 될 수 있습니다. – michael667

답변

1

술어를 유지해야하는 경우 (예 :

)
S_D.postcode = 'Liverpool' OR S.company LIKE 'Liverpool' OR S.town LIKE 'Liverpool' 

그런 다음 동일한 열에 색인을 추가하는 것이 좋습니다. 따라서 :

ALTER TABLE shop_delivery_area ADD KEY `sda_idx1` (`postcode`); 
ALTER TABLE shop ADD KEY `shop_idx1` (`company`); 
ALTER TABLE shop ADD KEY `shop_idx2` (`town`); 

또 다른 한 가지 요점은 퍼지 검색에 관한 것입니다. 'LIKE'를 '='로 바꾸면 속도가 증가합니다. 'LIKE'를 사용하여 퍼지 검색을하지 않고도 'LIVER'를 사용하는 것은 그리 많지 않습니다. 즉 LIKE 'Liverpool'입니다. LIKE '% Liverpool %'또는 'Liverpool'을 사용하십시오. 그래서 중 하나를 사용 : 당신이 후자를 사용하여 인덱스를 작성하는 경우

S_D.postcode = 'Liverpool' OR S.company LIKE '%Liverpool%' OR S.town LIKE '%Liverpool%' 

또는

S_D.postcode = 'Liverpool' OR S.company = 'Liverpool' OR S.town = 'Liverpool' 

는 다음 쿼리가 잘 실행해야합니다!

0
  1. 은 빈 문자열 (S_D.postcode = '' OR S.company LIKE '')
  2. 는 일반적으로 것입니다 LIKE 조건을 제거하기 등의 데이터, 인덱스의 당신의 양에 따라 상당한 성능 향상을 제공 할 수 IFNULL 대신 OR의 사용 쿼리를 많이 느리게, 그래서
  3. 은에 인덱스를 추가 가능 때마다 나는 그것을 피할 것 WHERE 열
+0

하지만 고객이 우편 번호, 회사 이름으로 검색하도록 허용하려면 어떻게해야합니까? 또는 마을? 검색 텍스트 상자는 하나만 있습니다. –

+0

SQL 쿼리를 업데이트했습니다. 제 말의 의미를 확인하십시오. –

+0

응용 프로그램 코드 내의 사용자 입력을 기반으로 쿼리를 준비해야합니다. 사용자가 마을을 채우고 다른 텍스트 상자가 비어있는 경우 - 마을 조건 만 조회하십시오. 모든 텍스트 상자가 비어있는 경우 - 조건없이 쿼리 (대신 S_D.postcode = ''또는 S.company LIKE ''또는 S.town LIKE '') – matino