1

ms-sql에서 데이터베이스를 개발하는 데 사용되었지만 이제는 mysql으로 이동했습니다. 위대한 진전. 문제는 내가 그래픽으로 쿼리 실행 계획을 볼 수있는 도구가 없다는 것입니다. ... EXPLAIN 정말 도움이되지 않습니다.MYSQL 성능 문제 select 또는 where

내가 approximatively 50000 개 항목이있는 테이블을해야합니다 : 따라서

나는이 일에 대한 조언이 필요 두 다음 쿼리 나에게 같은 결과를주고있다을하지만 난 것입니다 어느 알아야 할 더 거대한 데이터베이스에서 효율적/빠른. 처음에는 concat이 where에 있고, 두 번째에는 concection이있는 select에 있습니다.

SELECT idPatient, lastName, firstName, idCardNumber 
FROM optical.patient 
WHERE CONCAT(lastName,' ',firstName) LIKE "x%"; 


SELECT idPatient, CONCAT(lastName,' ',firstName) as formattedName, idCardNumber 
FROM optical.patient 
HAVING formattedName LIKE "x%"; 

미리 답변 해 주셔서 감사합니다.

+0

가 여기에 시도 할 수 있습니다 : HTTP : //www.mysqlperformanceblog.com/ – diEcho

+0

'EXPLAIN EXTENDED'는 유용한 정보를 제공합니까? –

답변

1

두 경우 모두 CONCAT을 모든 행에 대해 실행해야하므로이 두 쿼리의 차이점을 알 수 있다고 생각하지 않습니다. 난 당신이 그때에 인덱스를 추가 할 수 있기 때문에뿐만 아니라 데이터베이스에 formattedName 보관 고려하십시오. 이것은 아마도 쿼리를 최적화하기 위해 할 수있는 최선의 방법 일 것입니다.

출력을 시각화하는 데 도움이되는 pt-visual-explain이 있습니다.

4

두 버전 모두에서 쿼리는 WHERE를 해결하기 위해 인덱스를 사용할 수 없으며 전체 테이블 검색을 수행합니다. 그러나, 그들은에 equialent됩니다

SELECT idPatient, CONCAT(lastName,' ',firstName) as formattedName, idCardNumber 
FROM optical.patient 
WHERE lastName LIKE "x%"; 

그리고 당신이이 개 모든 필드에서 검색해야하는 경우 lastName

에 인덱스를 사용 union

SELECT idPatient, CONCAT(lastName,' ',firstName) as formattedName, idCardNumber 
FROM optical.patient 
WHERE firstName LIKE "x%"; 
UNION 
SELECT idPatient, CONCAT(lastName,' ',firstName) as formattedName, idCardNumber 
FROM optical.patient 
WHERE lastName LIKE "x%";