Um plano de explicação geralmente é o melhor lugar para começar sempre que você tiver uma consulta lenta. Para obter um, corra
DESCRIBE SELECT source_id FROM directions WHERE (destination_id = 10);
Isso mostrará uma tabela listando as etapas necessárias para executar sua consulta. Se você vir um valor grande na coluna 'linhas' e NULL na coluna 'chave', isso indica que sua consulta precisa verificar um grande número de linhas para determinar quais retornar.
Nesse caso, adicionar um índice em destination_id deve acelerar drasticamente sua consulta, com algum custo para inserir e excluir velocidade (já que o índice também precisará ser atualizado).