MYSQL performance slow using filesort

前端 未结 5 1025
Happy的楠姐
Happy的楠姐 2020-12-14 03:53

I have a simple mysql query, but when I have a lot of records (currently 103,0000), the performance is really slow and it says it is using filesort, im not sure if this is w

5条回答
  •  挽巷
    挽巷 (楼主)
    2020-12-14 04:08

    The problem is that MySQL only uses one index when executing the query. If you add a new index that uses the 3 fields in your WHERE clause, it will find the rows faster.

    ALTER TABLE `adverts` ADD INDEX price_status_approved(`price`, `status`, `approved`);
    

    According to the MySQL documentation ORDER BY Optimization:

    In some cases, MySQL cannot use indexes to resolve the ORDER BY, although it still uses indexes to find the rows that match the WHERE clause. These cases include the following:
    The key used to fetch the rows is not the same as the one used in the ORDER BY.

    This is what happens in your case. As the output of EXPLAIN tells us, the optimizer uses the key price to find the rows. However, the ORDER BY is on the field date_updated which does not belong to the key price.

    To find the rows faster AND sort the rows faster, you need to add an index that contains all the fields used in the WHERE and in the ORDER BY clauses:

    ALTER TABLE `adverts` ADD INDEX status_approved_date_updated(`status`, `approved`, `date_updated`);
    

    The field used for sorting must be in the last position in the index. It is useless to include price in the index, because the condition used in the query will return a range of values.

    If EXPLAIN still shows that it is using filesort, you may try forcing MySQL to use an index you choose:

    SELECT adverts.*
    FROM adverts
    FORCE INDEX(status_approved_date_updated)
    WHERE price >= 0
    AND adverts.status = 1
    AND adverts.approved = 1
    ORDER BY date_updated DESC 
    LIMIT 19990, 10
    

    It is usually not necessary to force an index, because the MySQL optimizer most often does the correct choice. But sometimes it makes a bad choice, or not the best choice. You will need to run some tests to see if it improves performance or not.

提交回复
热议问题