I plan on loading players' data into an array when they join. Should I do this on PlayerLoginEvent or PlayerJoinEvent
It depends when you need to use the data. Generally speaking, load your data asynchronously in login event.
Yes. But always check if the data are ready, because queries can easily throttle up when a lot of players join simultaneously. However this depends on your number of worker threads and actual connection speed. If you have 40 players joining simultaneously when the server starts, and each query takes 500ms to return, and you set 4 worker threads, you theoretically need 5 seconds to complete all queries (more if you have multiple queries per player). However, considering the slow connection speed of the client, this might not cause issues as dire as it sounds.