2011-11-18 2 views
0

현재 3 개의 다른 테이블과 3 개의 서로 다른 쿼리가 있습니다. 서로 다른 조인을 사용하여 서로 매우 유사합니다. 세 가지 쿼리를 하나의 쿼리로 결합하려고 시도했지만 지금까지별로 성공하지 못했습니다. 누군가가 더 나은 해결책이나 방향을 제시한다면 나는 매우 기쁠 것입니다. 감사.이 mysql 쿼리를 수행하는 더 좋은 방법은 무엇입니까?

0.0013  
SELECT `ilan_genel`.`id`, `ilan_genel`.`durum`, `ilan_genel`.`kategori`, `ilan_genel`.`tip`, `ilan_genel`.`ozellik`, `ilan_genel`.`m2`, `ilan_genel`.`fiyat`, `ilan_genel`.`baslik`, `ilan_genel`.`ilce`, `ilan_genel`.`mahalle`, `ilan_genel`.`parabirimi`, `kgsim_ilceler`.`isim` as ilce, (
SELECT ilanresimler.resimlink 
FROM ilanresimler 
WHERE ilanresimler.ilanid = ilan_genel.id LIMIT 1 
) AS resim 
FROM (`ilan_genel`) 
LEFT JOIN `kgsim_ilceler` ON `kgsim_ilceler`.`id` = `ilan_genel`.`ilce` 
ORDER BY `id` desc 
LIMIT 30 
0.0006  
SELECT `video`.`id`, `video`.`url`, `ilan_genel`.`ilce`, `ilan_genel`.`tip`, `ilan_genel`.`m2`, `ilan_genel`.`ozellik`, `ilan_genel`.`fiyat`, `ilan_genel`.`parabirimi`, `ilan_genel`.`kullanici`, `ilanresimler`.`resimlink` as resim, `uyeler`.`isim` as isim, `uyeler`.`soyisim` as soyisim, `kgsim_ilceler`.`isim` as ilce 
FROM (`video`) 
LEFT JOIN `ilan_genel` ON `ilan_genel`.`id` = `video`.`id` 
LEFT JOIN `kgsim_ilceler` ON `kgsim_ilceler`.`id` = `ilan_genel`.`ilce` 
LEFT JOIN `ilanresimler` ON `ilanresimler`.`id` = `ilan_genel`.`resim` 
LEFT JOIN `uyeler` ON `uyeler`.`id` = `ilan_genel`.`kullanici` 
ORDER BY `siralama` desc 
LIMIT 30 
0.0005  
SELECT `sanaltur`.`id`, `ilan_genel`.`ilce`, `ilan_genel`.`tip`, `ilan_genel`.`m2`, `ilan_genel`.`ozellik`, `ilan_genel`.`fiyat`, `ilan_genel`.`parabirimi`, `ilan_genel`.`kullanici`, `ilanresimler`.`resimlink` as resim, `uyeler`.`isim` as isim, `uyeler`.`soyisim` as soyisim, `kgsim_ilceler`.`isim` as ilce 
FROM (`sanaltur`) 
LEFT JOIN `ilan_genel` ON `ilan_genel`.`id` = `sanaltur`.`id` 
LEFT JOIN `kgsim_ilceler` ON `kgsim_ilceler`.`id` = `ilan_genel`.`ilce` 
LEFT JOIN `ilanresimler` ON `ilanresimler`.`id` = `ilan_genel`.`resim` 
LEFT JOIN `uyeler` ON `uyeler`.`id` = `ilan_genel`.`kullanici` 
ORDER BY `siralama` desc 
LIMIT 30 
+0

가'UNION'를 사용하여 시도? –

+1

너무 느리지 않아요 http://stackoverflow.com/questions/870080/why-are-union-queries-so-slow-in-mysql – motto

답변

3

이들은 실제로 세 가지 매우 다른 쿼리입니다. 나는 당신이 그것들을 유용하게 결합 할 수있을 것이라고 생각하지 않는다. 또한, 그들은 나에게 꽤 빨리 보인다.

그러나 각 개별 쿼리를 최적화하려는 경우 EXPLAIN SELECT을 사용하여 각 쿼리가 적절한 인덱스를 사용하는지 여부를 확인할 수 있습니다. 예를 들어

:

EXPLAIN SELECT * 
FROM A 
WHERE foo NOT IN (1,4,5,6); 

가 얻을 수 있음 :이 경우

+----+-------------+-------+------+--------------- 
| id | select_type | table | type | possible_keys 
+----+-------------+-------+------+--------------- 
| 1 | SIMPLE  | A  | ALL | NULL   
+----+-------------+-------+------+--------------- 

+------+---------+------+------+-------------+ 
| key | key_len | ref | rows | Extra  | 
+------+---------+------+------+-------------+ 
| NULL | NULL | NULL | 2 | Using where | 
+------+---------+------+------+-------------+ 

은 질의는 possible_keys 없었다 따라서 쿼리를 수행 할 수없는 (또는 NULL) key를 사용하지 않습니다. 그것은 당신이에 관심이있을하려는 key 열입니다

더 많은 정보를 여기에 :.

+0

통찰력있는 답변에 감사드립니다. 정말 좋은 설명입니다. 그러나, 나는 이미 색인을 사용하고 있으며 쿼리는 빠를 수 있지만 궁금한 점이 있다면 더 좋은 방법입니다. 나는 데이터베이스에 매번 3 가지 다른 쿼리를 보내고 싶지 않으며, 유니온 쿼리는 원래의 솔루션보다 조금 느린 것처럼 보입니다. – motto

+0

세 가지 쿼리를 보내는 데 아무런 문제가 없습니다. 문제가되고 데이터가 새로운 것이 아니라면 결과를 캐싱 해보십시오. –

+0

쿼리를 약간 더 빠르게 만들 수있는 유일한 방법은 [준비된 명령문] (http://dev.mysql.com/doc/refman/5.0/en/sql-syntax-prepared-statements.html)을 사용하는 것입니다. . 그래도 쿼리를 최적화했다면 프로파일 링을 사용하거나 쿼리 결과를 캐싱하여 코드에서 최적화 할 다른 위치를 찾아야합니다. 사용중인 시스템에 따라 다릅니다. 작은 최적화가 아닌 큰 최적화에 대해 걱정할 필요가 있습니다. –

관련 문제