2011-10-10 132 views
0

感謝您能否幫助我,請遷移應用程序並轉至mysql 5.5非常緩慢的查詢返回非常感謝您的幫助。慢查詢左外部連接Mysql

SELECT DISTINCT b.cc46_cc55_field_id_id AS row_id, t0.cc46_value AS f_264, t1.cc46_value AS f_265, t2.cc46_value AS f_266 
FROM tc46_fields_values b 
LEFT OUTER JOIN tc46_fields_values t0 ON b.cc46_cc55_field_id_id = t0.cc46_cc55_field_id_id 
    AND t0.cc46_cc26_field_id = 264 
LEFT OUTER JOIN tc46_fields_values t1 ON b.cc46_cc55_field_id_id = t1.cc46_cc55_field_id_id 
    AND t1.cc46_cc26_field_id = 265 
LEFT OUTER JOIN tc46_fields_values t2 ON b.cc46_cc55_field_id_id = t2.cc46_cc55_field_id_id 
    AND t2.cc46_cc26_field_id = 266 
WHERE b.cc46_cc55_field_id_id IN (5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936,5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952,5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968,5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984,5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116,6117,6118,6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,6132,6133,6134,6135,6136,6137,6138,6139,6140,6141,6142,6143,6144,6145,6146,6147,6148,6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163,6164,6165,6166) 
+0

您沒有給我們提供足夠的信息給我們任何具體的幫助。 –

+0

但我可以說的是,通常會發生緩慢的查詢,因爲您缺少重要列上的索引。請在此查詢上運行EXPLAIN並輸出結果。 http://dev.mysql.com/doc/refman/5.0/en/explain.html –

+2

你真的輸入了所有這些數字嗎? [之間的](http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#operator_between)? – Ben

回答

5

確保您在字段「cc46_cc55_field_id_id」上有一個索引。此外,不要用你的近200個ID列表...因爲你的版本是所有順序,只需使用一個BETWEEN子句..

SELECT DISTINCT 
     b.cc46_cc55_field_id_id AS row_id, 
     t0.cc46_value AS f_264, 
     t1.cc46_value AS f_265, 
     t2.cc46_value AS f_266 
    FROM 
     tc46_fields_values b 
     LEFT JOIN tc46_fields_values t0 
      ON b.cc46_cc55_field_id_id = t0.cc46_cc55_field_id_id 
      AND t0.cc46_cc26_field_id = 264 
     LEFT JOIN tc46_fields_values t1 
      ON b.cc46_cc55_field_id_id = t1.cc46_cc55_field_id_id 
      AND t1.cc46_cc26_field_id = 265 
     LEFT OUTER JOIN tc46_fields_values t2 
      ON b.cc46_cc55_field_id_id = t2.cc46_cc55_field_id_id 
      AND t2.cc46_cc26_field_id = 266 
    WHERE 
     b.cc46_cc55_field_id_id between 5924 and 6166 
+0

相當可怕的字段名稱,我必須說。很好的答案,一邊,P – Bojangles

+0

我希望我能投票兩次。一旦提供了一個很好的答案(可能是正確的)(缺少索引是查詢速度緩慢的主要原因),並且需要花一些時間重新格式化這些虛弱的查詢。 –

0

要查看索引使用何種運行

EXPLAIN SELECT DISTINCT 
     b.cc46_cc55_field_id_id AS row_id, 
     t0.cc46_value AS f_264, 
     t1.cc46_value AS f_265, 
     t2.cc46_value AS f_266 
    FROM 
     tc46_fields_values b 
     LEFT JOIN tc46_fields_values t0 
      ON b.cc46_cc55_field_id_id = t0.cc46_cc55_field_id_id 
      AND t0.cc46_cc26_field_id = 264 
     LEFT JOIN tc46_fields_values t1 
      ON b.cc46_cc55_field_id_id = t1.cc46_cc55_field_id_id 
      AND t1.cc46_cc26_field_id = 265 
     LEFT OUTER JOIN tc46_fields_values t2 
      ON b.cc46_cc55_field_id_id = t2.cc46_cc55_field_id_id 
      AND t2.cc46_cc26_field_id = 266 
    WHERE 
     b.cc46_cc55_field_id_id between 5924 and 6166 
0

嘗試此查詢,而不是:

SELECT b.cc46_cc55_field_id_id AS row_id, t0.cc46_value AS f_264, t1.cc46_value AS f_265, t2.cc46_value AS f_266 
FROM 
tc46_fields_values b LEFT OUTER JOIN tc46_fields_values t0 ON b.cc46_cc55_field_id_id = t0.cc46_cc55_field_id_id 
LEFT OUTER JOIN tc46_fields_values t1 ON b.cc46_cc55_field_id_id = t1.cc46_cc55_field_id_id 
LEFT OUTER JOIN tc46_fields_values t2 ON b.cc46_cc55_field_id_id = t2.cc46_cc55_field_id_id 
WHERE 
t0.cc46_cc26_field_id = 264 
AND 
t1.cc46_cc26_field_id = 265 
AND 
t2.cc46_cc26_field_id = 266 
AND 
b.cc46_cc55_field_id_id IN (5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936,5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952,5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968,5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984,5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116,6117,6118,6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,6132,6133,6134,6135,6136,6137,6138,6139,6140,6141,6142,6143,6144,6145,6146,6147,6148,6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163,6164,6165,6166) 
GROUP BY 
b.cc46_cc55_field_id_id 

而不是使用不同的使用組。