일부 하위 쿼리 (내부 선택)가있는 쿼리가 있는데, 성능, 하나의 큰 쿼리 또는 작은 쿼리를 많이 더 잘 작동하도록 노력하고있어, 시도가 어렵고 시간 차이가 내 서버에서 항상 변하기 때문에 시간이 많이 걸립니다.MYSQL 쿼리 최적화, 다중 쿼리 또는 하나의 큰 쿼리
아래의 쿼리를 사용하여 내 웹 사이트에 페이지 매김 (오프셋 및 제한)을 사용하여 한 번에 10 개의 결과를 표시합니다.
SELECT adverts.*, breed.breed, breed.type, sellers.profile_name, sellers.logo, users.user_level ,
round(sqrt((((adverts.latitude - '51.558430') * (adverts.latitude - '51.558430')) * 69.1 * 69.1) + ((adverts.longitude - '-0.0069345') * (adverts.longitude - '-0.0069345') * 53 * 53)), 1) as distance,
(SELECT advert_images.image_name FROM advert_images WHERE advert_images.advert_id = adverts.advert_id AND advert_images.main = 1 LIMIT 1) as imagename,
(SELECT count(advert_images.advert_id) from advert_images WHERE advert_images.advert_id = adverts.advert_id) AS num_photos
FROM adverts
LEFT JOIN breed ON adverts.breed_id = breed.breed_id
LEFT JOIN sellers ON (adverts.user_id = sellers.user_id)
LEFT JOIN users ON (adverts.user_id = users.user_id)
WHERE (adverts.status = 1) AND (adverts.approved = 1)
AND (adverts.latitude BETWEEN 51.2692837281 AND 51.8475762719) AND (adverts.longitude BETWEEN -0.472015213613 AND 0.458146213613)
having (distance <= '20')
ORDER BY distance ASC
LIMIT 0,10
는 메인 쿼리에서 아래의 2 내부 선택을 제거하는 것이 더 있을까하고 내 PHP는 루프에서, 2 번 루프에서 각 레코드에 대해, 10 번을 선택 전화를?
(SELECT advert_images.image_name FROM advert_images WHERE advert_images.advert_id = adverts.advert_id AND advert_images.main = 1 LIMIT 1) as imagename,
(SELECT count(advert_images.advert_id) from advert_images WHERE advert_images.advert_id = adverts.advert_id) AS num_photos
안녕하세요. 자세한 답변을 보내 주셔서 감사합니다. 내가 그룹에 언급 한 첫 번째 방법으로 내부 선택을 제거하려고했지만 쿼리가 원래보다 느리게 진행되었습니다. 임시 테이블은 좋은 생각처럼 들리지만 웹 사이트가 매우 바쁠 때마다 쿼리가 서버에서 매초 약 10 회 실행될 때 제대로 작동합니까? – user1052096
@ user1052096, 임시 테이블 접근 방식에 대한 두 개의 쿼리가 서로 충분히 근접한 한 영향은 거의 없습니다. 임시 테이블은 연결에 대해 로컬이므로 어떤 이름 충돌도 발생하지 않습니다. 그리고'tmp' 테이블의 메모리 소비량은 두 번째 쿼리 결과의 많은 열과 비교할 때 작아야하므로 결합 된 솔루션은 원래 쿼리보다 적은 메모리를 사용하게 될 것입니다. 그러나 나는 다른 생각을 가지고 있습니다. 나는 잠시 후에 나의 대답을 편집 할 것입니다. – MvG
안녕하세요, MvG, 작동하지 않는 하위 쿼리를 사용하여 업데이트 주셔서 감사합니다. 하위 쿼리를 실행하는 경우 0.02 초로 실행되지만, advert_id를 선택하지 않고 하위 쿼리를 실행하면 0.01으로 두 배 빠르게 실행됩니다. – user1052096