I have a table w/ 3 columns: name, phone, date.
I have 3 indexes: 1 on phone, 1 on date and 1 on phone and date.
I have the following statement:
SELECT * FROM ( SELECT * FROM people WHERE phone IS NOT NULL ORDER BY date DESC) as t GROUP BY phone
Basically, I want to get all unique phone numbers ordered by date. This table has about 2.5 million rows but takes forever to execute….are my indexes right?
UPDATE:
My EXPLAIN statement comes back with 2 rows: 1 for primary table and 1 for derived table.
It says I am using temporary and using filesort for my primary table.
For my derived table, it says my possible keys are (phone), and (phone, date) but it is using filesort.
I think your 3rd index is redundant, since it should already be covered by the individual indexes on the date and phone columns.
However, in your case I don’t think the indexes are the real cause of the query being slow. Instead the real problem is probably the inner query that is producing huge temporary data set and as far as I know MySql is not really optimized for this.
UPDATE:
I think the following query should have the same output as yours, but would avoid the inner select: