2012-04-10 5 views
1

나는 다음과 같은 쿼리를 실행하고 나는 그것을 변경하지만, 아직 완전히 받아 들일 수있는 실행하는 데 약 5 초 걸립니다 ...MySQL의 테이블이나 쿼리 최적화

쿼리 :

SELECT cat1, cat2, cat3, PRid, title, genre, artist, author, actors, imageURL, 
lowprice, highprice, prodcatID, description 
from products 
where title like '%' AND imageURL <> '' AND cat1 = 'Clothing and accessories' 
order by userrating desc 
limit 500 

I 'like %'을 꺼내고 "imageURl <" ''을 꺼내려고했지만 여전히 동일합니다. 나는 여전히 같은 열을 하나만 반환하려고했습니다.

나는 테이블에있는 거의 모든 열, 물론 쿼리에서 언급 한 모든 열에 대해 색인을 가지고 있습니다.

기본적으로 카테고리 목록입니다. 전체 텍스트 색인이있는 제목 열에서 전체 텍스트 검색을 수행하면 1 초 이내에 완료됩니다.

cat1 열에 다른 전체 텍스트 인덱스를 추가하고 쿼리 포커스를 해당 열의 "일치"로 변경해야합니까?

너무 많이 기대합니까?

테이블의 행 수가 3 백만 개에 미달합니다.

+0

테이블 스키마 – amd

+0

거의 모든 열에 3 백만 행의 테이블과 인덱스를 표시 할 수 있습니까? 좋지 않습니다. –

답변

1

모든 열에 색인이 있다고하셨습니다. 같은 색인이 있습니까?

alter table products add index (cat1, userrating) 

그렇지 않은 경우 시도해보십시오. 해당 쿼리를 실행하고 빠르게 실행되는지 알려주십시오.

또한 실제로 제목, 입력란에 % 대신 필터를 설정한다고 가정합니다.

+1

아직도 반갑지는 않지만 커팅 타임이 더 많습니다. - 고마워요! –

1

cat1을 정수로 사용하고이 3 백만 행의 문자열을 사용해야합니다. 색인을 올바르게 작성해야합니다. 모든 열의 색인 생성 만 개선되면 시스템이 수행하는 기본 작업이됩니다.

그 외에도 title LIKE '%'은 아무 것도하지 않습니다. 당신이 그것을 검색 할 때 사용하는 것 같아 `title LIKE 'search%'

이것을 가져 오는 데 어떤 종류의 프레임 워크를 사용하나요? 많은 컬럼이있는 500 개의 행을 얻으면 프레임 워크가이를 큰 배열에 저장하면 시스템이 고갈 될 수 있습니다. 아마도 그렇지 않을 수도 있습니다. :
일반 $query = mysql_query()while($row = mysql_fetch_object($query))을 실행 해 봅니다.

0

쿼리 된 열 : index, imageURL 및 cat1이있는 인덱스를 추가하는 것이 좋습니다. 두 번째 개선 사항 : SQL 서버 캐시를 사용하면 치명적인 속도가 개선됩니다. 마지막 개선 사항 : 쿼리가 항상 이와 비슷한 경우 값만 변경된 다음 준비된 문을 사용하십시오.

0

글쎄, LIKE 절의 첫 번째 문자로 %이 해당 열에 대한 전체 테이블 스캔을 제공한다는 것을 확신합니다 (이미 전체 테이블 스캔을 실행하지 않았기 때문에 이미 제한이 있으므로 AND 절에있는 절). 그 옆에 cat1 열에 대한 색인을 추가하려고합니다. 또한 데이터 세트의 크기를 줄이기 위해 쿼리에 다른 기준을 추가하십시오. 작업 데이터 세트 (LIMIT 절이없는 쿼리와 일치하는 행 수)도 너무 클 수 있습니다.