开发者

slow query LEFT OUTER JOIN Mysql

thanks can you help me please, I'm migrating an application and go to mysql 5.5 is very slow query returned thank you very much for your help.

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,6开发者_开发百科033,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)


Ensure you have an index on the field "cc46_cc55_field_id_id". In addition, don't use your list of almost 200 IDs... Since your version is all sequential, just use a BETWEEN clause..

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


To see what indexes are used run

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


Try to this query instead:

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

instead of using distinct use group by.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜