I have a function do_something(start: u64, end: u64) -> Result<JobResult, JobError>, and I can spawn multiple do_something() calls and gather all the JobResult into a Vec<JobResult>.
I don't how to do it concurrently with async/await, I have no yet previous Rust async/await knowledge.
It depends on what your jobs are exactly doing and how. Do you mean that currently you are spawning threads and joining them? Are your jobs I/O bound or compute bound? Etc.
Since LMDB is an in-memory database, I'll assume the crate you use to access LMDB provides a synchronous interface (no Futures returned, no mentions of async in the documentation), hence your tasks should count as CPU-bound.
If you have an iterator of the (start, end) pairs that are the input to your do_something function, you can use the aforementioned rayon crate to create a parallel iterator (look for par_iter). You can then use the usual iterator methods to perform your processing (i.e. map and friends).