SELECT 
  p.*, 
  d.*, 
  images.promotion_image_id 
FROM 
  cscart_promotions as p 
  LEFT JOIN cscart_promotion_descriptions as d ON p.promotion_id = d.promotion_id 
  AND d.lang_code = 'vi' 
  LEFT JOIN cscart_promotion_images AS images ON images.promotion_id = p.promotion_id 
  AND images.lang_code = 'vi' 
WHERE 
  p.promotion_id = 32

Query time 0.00040

JSON explain

{
  "query_block": {
    "select_id": 1,
    "const_condition": "1",
    "table": {
      "table_name": "p",
      "access_type": "const",
      "possible_keys": ["PRIMARY"],
      "key": "PRIMARY",
      "key_length": "3",
      "used_key_parts": ["promotion_id"],
      "ref": ["const"],
      "rows": 1,
      "filtered": 100
    },
    "table": {
      "table_name": "d",
      "access_type": "const",
      "possible_keys": ["PRIMARY"],
      "key": "PRIMARY",
      "key_length": "9",
      "used_key_parts": ["promotion_id", "lang_code"],
      "ref": ["const", "const"],
      "rows": 1,
      "filtered": 100
    },
    "table": {
      "table_name": "images",
      "access_type": "const",
      "possible_keys": ["promo"],
      "key": "promo",
      "key_length": "10",
      "used_key_parts": ["promotion_id", "lang_code"],
      "ref": ["const", "const"],
      "rows": 0,
      "filtered": 0,
      "unique_row_not_found": true
    }
  }
}

Result

promotion_id company_id conditions bonuses to_date from_date priority stop stop_other_rules zone conditions_hash status number_of_usages users_conditions_hash ignore_promo_ids name short_description detailed_description lang_code promotion_image_id
32 0 a:3:{s:3:"set";s:3:"all";s:9:"set_value";s:1:"1";s:10:"conditions";a:1:{i:1;a:3:{s:8:"operator";s:2:"in";s:9:"condition";s:8:"products";s:5:"value";s:2:"67";}}} a:1:{i:1;a:3:{s:5:"bonus";s:16:"product_discount";s:14:"discount_bonus";s:8:"to_fixed";s:14:"discount_value";s:4:"1000";}} 1891915500 1703045100 0 N N catalog products=67 A 4 Promooo vi