ColdFusion 웹 사이트에서 호출되는 ColdFusion Component에서 다음 MYSQL 쿼리가 있습니다. 나는 기본적으로 "PlaceName, Country, Adm1, adm2, adm3, locality"필드에 대한 부울 쿼리를 작성하는 사용자 지정 테이크를 가지고 있습니다.어떻게 복잡한 MYSQL 쿼리 속도를?
<!--- SEARCH PLACES 2--->
<cffunction name="searchPlaces_full" access="public" returntype="query">
<cfargument name="q" type="string" required="yes">
<CF_BOOLSEARCH searchterm="#arguments.q#" field="PlaceName,Country,Adm1,adm2,adm3,locality " booloperator="and">
<cfquery name="GetPlaces" datasource="#application.settings.dsn#">
SELECT
places.CatID,
places.PlaceName,
places.PlaceID,
places.Address1,
places.PostalCode,
places.Locality,
places.Address2,
places.ImageThumb,
places.Adm1,
places.Country,
places.Adm2,
places.Adm3,
places.contributorid,
places.lng,
places.lat,
places.verified,
places.verified_by,
places.verified_date
FROM places INNER JOIN places_cats ON places.PlaceID = places_cats.PlaceID
WHERE
<cfif len(trim(arguments.q))>
(#PreserveSingleQuotes(boolsearch)#)
<cfelse>
1=0
</cfif>
AND places_cats.CATID IN (#arguments.categories#)
GROUP BY
places.CatID,
places.PlaceName,
places.PlaceID,
places.Address1,
places.PostalCode,
places.Locality,
places.Address2,
places.ImageThumb,
places.Adm1,
places.Country,
places.Adm2,
places.Adm3,
places.contributorid,
places.lng,
places.lat,
places.verified,
places.verified_by,
places.verified_date
ORDER BY PlaceName
</cfquery>
<cfreturn getPlaces>
</cffunction>
데이터베이스에 624227 개의 레코드가 있습니다. Chappaqua를 검색하면 실제로 실행되는 SQL은 다음과 같습니다.
SELECT
places.CatID,
places.PlaceName,
places.PlaceID,
places.Address1,
places.PostalCode,
places.Locality,
places.Address2,
places.ImageThumb,
places.Adm1,
places.Country,
places.Adm2,
places.Adm3,
places.contributorid,
places.lng,
places.lat,
places.verified,
places.verified_by,
places.verified_date
FROM places INNER JOIN places_cats ON places.PlaceID = places_cats.PlaceID
WHERE
(((PlaceName LIKE '%chappaqua%') OR (Country LIKE '%chappaqua%') OR (Adm1 LIKE '%chappaqua%') OR (adm2 LIKE '%chappaqua%') OR (adm3 LIKE '%chappaqua%') OR (locality LIKE '%chappaqua%')))
AND places_cats.CATID IN (1,21,15,32,16,26,29,27,28,25,75,89,38,5,36,88,87,31,33,24,35,37,90,39,40,34,30,9,8,7,11,20,19,96,97,95,13,17,14,12,3,2,4,84,85,86)
GROUP BY
places.CatID,
places.PlaceName,
places.PlaceID,
places.Address1,
places.PostalCode,
places.Locality,
places.Address2,
places.ImageThumb,
places.Adm1,
places.Country,
places.Adm2,
places.Adm3,
places.contributorid,
places.lng,
places.lat,
places.verified,
places.verified_by,
places.verified_date
ORDER BY PlaceName
나는 그것이 추하고 복잡하다는 것을 알고 있습니다. 실행하려면 약 1836ms가 걸립니다. 반환 된 데이터를 빠르게 처리 할 수 있도록 쿼리 나 코드를 작성하는 더 좋은 방법이 있습니까? 여기
는이 SQL에 대한 설명입니다 :
색인을 보여주십시오. 'EXPLAIN'을 보여주십시오. – Kermit
집계 함수를 사용하지 않는 것처럼 보이므로 GROUP BY는 무엇입니까? – Strawberry
@Strawberry 그들은'DISTINCT' 행을 얻으려고합니다. – Taryn