2010-07-12 3 views
1

ORDER BY 절에 문제가 있습니다. 다음 쿼리에서 ORDER BY를 제거하면 쿼리가 0.004 초 후에 완료됩니다. 유지하면 쿼리가 매우 느리게 실행되고 = 56 초. MySQL은 처음에는 500,000 개의 레코드를 모두 가져온 다음 첫 번째 18 개의 레코드 만 정렬하고 마지막으로 회수하기 때문입니다.큰 테이블의 ORDER BY가 느림

어떻게하면 큰 테이블 주문 문제를 해결할 수 있습니까?

감사합니다.

설명 : http://img444.imageshack.us/img444/9440/explain.png

SQL 쿼리 :

이 가
SELECT `_sd`.`sazbaDPHId`, `_sd`.`sazbaDPH`, `_sd`.`sazbaDPHProcent`, `_zk`.`zboziKategorieId`, `_zk`.`zboziId`, 
    `_zk`.`kategorieId`, `_zk`.`zboziKategoriePoradi`, `_k`.`kategorieId`, `_k`.`kategorieNazev`, `_k`.`kategorieCelyNazev`, 
    `_k`.`kategorieKod`, `_k`.`kategorieCesta`, `_k`.`kategoriePopis`, `_k`.`kategorieKeywords`, `_k`.`kategorieRodiceId`, `_k`.`kategoriePoradi`, `_k`.`kategorieSkryta`, `_k`.`kategorieVTopMenu`, `_v`.`vyrobceId`, `_v`.`vyrobceNazev`, `_v`.`vyrobceKod`, 
    `_v`.`vyrobceKoeficient`, `_tzvz`.`typZboziVlastnostZboziId`, `_tzvz`.`typZboziId`, `_tzvz`.`vlastnostZboziId`, 
    `_vzh`.`vlastnostZboziHodnotaId`, `_vzh`.`zboziId`, `_vzh`.`vlastnostZboziId`, `_vzh`.`vlastnostZboziHodnota`, `zvc`.`zboziVyslCenaId` AS`zvc_zboziVyslCenaId`, `zvc`.`zboziVyslCenaZboziId` AS`zvc_zboziVyslCenaZboziId`, `zvc`.`vyslCena` AS`zvc_vyslCena`, 
    `zvc`.`vyslCenaSDPH` AS`zvc_vyslCenaSDPH`, `this`.`zboziId`, `this`.`zboziNazev`, `this`.`zboziKod`, `this`.`zboziIdentifikator`, 
    `this`.`zboziPartNum`, `this`.`zboziEAN`, `this`.`zboziPopis`, `this`.`zboziOstatniParametry`, `this`.`zboziInterniInfo`, 
    `this`.`zboziProdejniCena`, `this`.`zboziAkcniCena`, `this`.`zboziSetovaCena`, `this`.`zboziMocCena`, `this`.`sazbaDPHId`, 
    `this`.`vyrobceId`, `this`.`typZboziId`, `this`.`stavZboziId`, `this`.`skladovaDostupnostId`, `this`.`zdrojCenId`, `this`.`zboziPHE`, 
    `this`.`zboziAutorskyPoplatek`, `this`.`zboziVahovyPoplatek`, `this`.`nemenitStavZbozi` 
    FROM `tbl_Zbozi`AS this 
    LEFT JOIN `reg_SazbaDPH`AS _sd ON this.sazbaDPHId = _sd.sazbaDPHId 
    LEFT JOIN `tbl_Zbozi_Kategorie`AS _zk ON this.zboziId = _zk.zboziId 
    LEFT JOIN `tbl_Kategorie`AS _k ON _zk.kategorieId = _k.kategorieId 
    LEFT JOIN `tbl_Vyrobce`AS _v ON this.vyrobceId = _v.vyrobceId 
    LEFT JOIN `tbl_TypZbozi_VlastnostZbozi`AS _tzvz ON this.typZboziId = _tzvz.typZboziId 
    LEFT JOIN `tbl_VlastnostZboziHodnota`AS _vzh ON this.zboziId = _vzh.zboziId AND _vzh.vlastnostZboziId = _tzvz.vlastnostZboziId 
    LEFT JOIN `tbl_Zbozi_VyslCena`AS zvc ON this.zboziId = zvc.zboziVyslCenaZboziId 
    WHERE _k.kategorieId IN (155317, 5570, 155445, 5706, 5707, 155429, 155430, 155431, 5708, 5709, 5710, 155427, 155426, 155428, 11413, 5713, 
    5714, 5715, 5716, 5717, 5718, 5719, 5720, 10245, 10253, 11253, 10834, 10269, 10249, 10246, 10247, 10248, 5723, 5725, 5726, 5727, 5728, 5729,   
    155319, 5815, 5816, 5817, 5818, 5819, 5822, 5824, 5832, 11406, 11411, 11410, 11409, 
    6069, 6070, 6072, 6073, 6075, 6078, 6086, 11414, 6185, 155433, 6186, 6187, 6188, 6190, 6191, 6193, 6198, 6199, 6200, 6201, 6202, 6203, 6207, 
    6209, 11442, 6210, 6211, 6212, 6215, 6216, 6217, 6218, 6219, 6220, 155366, 6221, 11339, 11340, 11341, 11359, 6222, 6223, 6224, 6225, 6226, 
    6227, 6228, 11099, 155376, 6231, 6232, 6233, 6234, 6235, 6236, 155391, 155392, 155437, 6237, 6238, 6241, 6243, 6244, 6245, 6246, 6247, 6248, 
    6249, 6250, 6251, 6252, 6253, 6254, 6256, 6257, 6258, 6259, 6260, 6261, 10839, 155362, 6262, 6263, 6264, 6265, 155361, 6267, 6269, 11390, 
    11346, 11112, 11394, 11397, 155393, 6270, 11436, 10292, 6271, 6272, 6275, 6277, 6278, 6279, 6280, 6281, 11348, 10288, 11113, 6283, 6284, 
    6285, 6287, 155494, 11114, 6292, 6293, 6294, 6295, 6296, 6297, 6298, 6300, 6301, 6302, 6303, 6304, 11116, 6305, 10781, 6306, 6307, 6308, 
    6309, 6310, 6311, 6313, 6314, 6315, 6316, 6317, 6318, 6327, 6328, 155451, 6333, 6334, 6335, 6337, 6340, 6342, 6343, 6344, 6345, 6346, 11344, 
    11389, 10289, 10291, 10302, 10303, 10304, 10294, 10306, 10300, 10305, 10293, 10299, 10298, 10290, 10296, 10297, 11454, 11100, 11101, 
    11117, 131475, 11402, 5680, 5684, 5685, 5686, 5687, 5688, 5689, 11383, 5702, 5703, 5704, 5705) 
AND stavZboziId IN (2) 
AND zvc.zboziVyslCenaSkupinaId = '8' 
ORDER BY _k.kategoriePoradi ASC LIMIT 18 
+0

붙여 넣기 출력을하여 kategoriePoradi 컬럼에 인덱스를 추가하여 속도를 높일 수 있습니다. – Naktibalda

+0

설명 결과 screenshot –

+0

MySQL에 상응하는 내용이 무엇인지 모르겠습니다. 그러나 MSSQL을 사용하면 쿼리를 작은 부분으로 나누고 각 부분에서 수행 할 작업과 전반적인 영향을 설명하는 쿼리 계획을 내릴 수 있습니다. 쿼리를 최적화하려고 할 때 변경 사항이 발생하는 것보다 낫습니다. –

답변

3

어떻게 다른 사람이 일할 수있는? 18 개의 레코드를 선택한 후 주문을 적용하면 기본 순서대로 상위 18 개의 레코드가 나오고 정렬됩니다.

IN 문에있는 모든 값을 임시 테이블에 삽입 한 다음 임시 테이블에 조인하면 성능이 향상 될 수 있습니다.

+0

감사합니다. Ben, 시도했지만 45 초로 단축되었습니다. –

2

여전히 찾기 위해 50 만 개 레코드를 정렬하는 사용자의 18 그래서 많이 느려집니다, 당신은 당신의 테이블에 쿼리에 대한 EXPLAIN의

+0

감사합니다. Dave, kategoriePoradi에 BTREE 인덱스를 추가했지만 성능을 얻지 못했습니다. 그러나 모든 WHERE/JOIN 열에 인덱스가 있습니다. –

관련 문제