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

Query time 0.00617

JSON explain

{
  "query_block": {
    "select_id": 1,
    "cost_info": {
      "query_cost": "2076.65"
    },
    "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.10",
            "prefix_cost": "0.00",
            "data_read_per_join": "2K"
          },
          "used_columns": [
            "category_id",
            "id_path"
          ]
        }
      },
      {
        "table": {
          "table_name": "a",
          "access_type": "index",
          "key": "id_path",
          "used_key_parts": [
            "id_path"
          ],
          "key_length": "767",
          "rows_examined_per_scan": 20364,
          "rows_produced_per_join": 2262,
          "filtered": "11.11",
          "using_index": true,
          "cost_info": {
            "read_cost": "40.25",
            "eval_cost": "226.24",
            "prefix_cost": "2076.65",
            "data_read_per_join": "5M"
          },
          "used_columns": [
            "category_id",
            "id_path"
          ],
          "attached_condition": "(`goimagine`.`a`.`id_path` like <cache>(concat('23','/%')))"
        }
      }
    ]
  }
}

Result

category_id
129
29
22840
22841
22842
22843
22844
22845
22846
30
31
22829
22830
22831
22832
22833
22834
32
33
34
22835
22836
22837
22838
22839
35
36
38
22891
22892
22893
22894
37
22886
22887
22888
22889
22890
6272