【问题标题】:slow query LEFT OUTER JOIN Mysql慢查询 LEFT OUTER JOIN Mysql
【发布时间】:2011-10-10 23:22:12
【问题描述】:

谢谢你能帮帮我吗,我正在迁移应用程序并转到 mysql 5.5 查询返回非常慢,非常感谢你的帮助。

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)

【问题讨论】:

  • 您没有提供足够的信息让我们为您提供任何具体帮助。
  • 但我可以说的是,由于缺少重要列上的索引,通常会发生缓慢的查询。请对此查询运行 EXPLAIN 并输出结果。 dev.mysql.com/doc/refman/5.0/en/explain.html
  • 你真的输入了所有这些数字吗? between呢?
  • 避免不提供更多信息并组织查询以使其更易于理解。字段的名称存储在代码中是一个唯一的表,它存储以不同形式出现的信息,这些信息是由用户按顺序创建的,但是在这个示例中,如果您可以添加或删除更多字段。感谢您的帮助。

标签: mysql join outer-join


【解决方案1】:

确保您在“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

【讨论】:

  • 相当可怕的字段名称,我必须说。好的答案,除此之外;P
  • 我希望我能投票两次。一次是为了提供一个可能是正确的好答案(缺少索引是查询缓慢的主要原因),一次是为了花时间重新格式化那个糟糕的查询。
【解决方案2】:

查看使用了哪些索引运行

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

【讨论】:

    【解决方案3】:

    改用这个查询:

    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
    

    而不是使用 distinct use group by。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-10
      • 2013-03-14
      • 1970-01-01
      • 1970-01-01
      • 2015-03-16
      相关资源
      最近更新 更多