При построении составных индексов учитывайте то, какой объем данных у вас будет попадать на первый и второй индекс. Выполнив два запроса SELECT lastname_id, count(*) FROM t GROUP BY lastname_id и SELECT firstname_id, count(*) FROM t GROUP BY firstname_id , можно увидеть, сколько записей содержит каждое значение колонки в таблице. Там, где меньше - ту колонку и нужно ставить первой в индекс, так как если среднее кол-во значений lastname_id будет равно 1000, а firstname_id - 20000, то MySQL сразу сократит количество перебираемых записей до 1000, вместо 20000.
Так же советую почитать про EXPLAIN - очень помогает находить тяжелые запросы и лучше понять, как MySQL делает поиск.