SELECT 
  a.category_id 
FROM 
  q_categories as a 
  LEFT JOIN q_categories as b ON b.category_id IN (2) 
WHERE 
  a.id_path LIKE CONCAT(b.id_path, '/%')

Query time 0.00056

JSON explain

{
  "query_block": {
    "select_id": 1,
    "cost_info": {
      "query_cost": "134.53"
    },
    "nested_loop": [
      {
        "table": {
          "table_name": "b",
          "access_type": "const",
          "possible_keys": [
            "PRIMARY",
            "p_category_id"
          ],
          "key": "PRIMARY",
          "used_key_parts": [
            "category_id"
          ],
          "key_length": "3",
          "ref": [
            "const"
          ],
          "rows_examined_per_scan": 1,
          "rows_produced_per_join": 1,
          "filtered": "100.00",
          "cost_info": {
            "read_cost": "0.00",
            "eval_cost": "0.20",
            "prefix_cost": "0.00",
            "data_read_per_join": "2K"
          },
          "used_columns": [
            "category_id",
            "id_path"
          ]
        }
      },
      {
        "table": {
          "table_name": "a",
          "access_type": "ALL",
          "rows_examined_per_scan": 598,
          "rows_produced_per_join": 66,
          "filtered": "11.11",
          "cost_info": {
            "read_cost": "14.93",
            "eval_cost": "13.29",
            "prefix_cost": "134.53",
            "data_read_per_join": "175K"
          },
          "used_columns": [
            "category_id",
            "id_path"
          ],
          "attached_condition": "(`portal`.`a`.`id_path` like <cache>(concat('2','/%')))"
        }
      }
    ]
  }
}

Result

category_id
3
4
101
102
107
114
118
130
134
139
145
246
404
524
586
590
5
100
103
106
108
115
119
131
135
140
146
247
525
591
10
39
104
109
113
116
120
132
136
141
366
526
592
11
105
110
117
121
133
137
142
400
527
593
111
122
124
138
143
403
523
594
112
123
144
457
458
616
245
549
583
405
585
432
577
578
589
617