SELECT 
  COUNT(*) 
FROM 
  vi_promotions 
  LEFT JOIN vi_promotion_descriptions ON vi_promotion_descriptions.promotion_id = vi_promotions.promotion_id 
  AND vi_promotion_descriptions.lang_code = 'it' 
  LEFT JOIN vi_storefronts_promotions AS storefronts_promotions ON storefronts_promotions.promotion_id = vi_promotions.promotion_id 
  LEFT JOIN vi_promotion_images ON vi_promotion_images.promotion_id = vi_promotions.promotion_id 
  AND vi_promotion_images.lang_code = 'it' 
WHERE 
  1 
  AND status IN ('A') 
  AND (
    storefronts_promotions.storefront_id = 1 
    OR storefronts_promotions.storefront_id IS NULL
  ) 
  AND vi_promotions.promotion_id NOT IN (25, 26, 27)

Query time 0.00018

JSON explain

{
  "query_block": {
    "select_id": 1,
    "nested_loop": [
      {
        "table": {
          "table_name": "vi_promotions",
          "access_type": "ALL",
          "possible_keys": ["PRIMARY"],
          "rows": 14,
          "filtered": 100,
          "attached_condition": "vi_promotions.`status` = 'A' and vi_promotions.promotion_id not in (25,26,27)"
        }
      },
      {
        "block-nl-join": {
          "table": {
            "table_name": "storefronts_promotions",
            "access_type": "index",
            "key": "PRIMARY",
            "key_length": "8",
            "used_key_parts": ["storefront_id", "promotion_id"],
            "rows": 11,
            "filtered": 100,
            "using_index": true
          },
          "buffer_type": "flat",
          "buffer_size": "148",
          "join_type": "BNL",
          "attached_condition": "trigcond(storefronts_promotions.storefront_id = 1 or storefronts_promotions.storefront_id is null) and trigcond(storefronts_promotions.promotion_id = vi_promotions.promotion_id)"
        }
      }
    ]
  }
}

Result

COUNT(*)
11