Indeed: WITH RECURSIVE ordered AS ( SELECT * FROM list WHERE prev = 0 UNION ALL SELECT list.* FROM list JOIN ordered ON list.prev = ordered.row_id ) SELECT * FROM ordered; This should have an index on `prev`.
Indeed: WITH RECURSIVE ordered AS ( SELECT * FROM list WHERE prev = 0 UNION ALL SELECT list.* FROM list JOIN ordered ON list.prev = ordered.row_id ) SELECT * FROM ordered; This should have an index on `prev`.