MySQL Query Optimization - PullRequest
       2

MySQL Query Optimization

2 голосов
/ 28 марта 2012

Нужна помощь в оптимизации запроса ниже.Кажется, на данный момент существуют два узких места, из-за которых на выполнение запроса уходит около 90-х годов.Там всего 5000 продуктов, так что это не совсем массивная база данных / таблица.Узкими местами являются SQL_CALC_FOUND_ROWS и оператор ORDER BY - если я удаляю оба из них, выполнение запроса занимает около секунды.Я попытался удалить SQL_CALC_FOUND_ROWS и запустить оператор count (), но это также занимает много времени ..

Лучше всего будет использовать INNER JOIN (с которым я не слишком знаком)) согласно следующему сообщению Stackoverflow? Медленный запрос при использовании ORDER BY

SELECT SQL_CALC_FOUND_ROWS * 
FROM tbl_products
LEFT JOIN tbl_link_products_categories ON lpc_p_id = p_id
LEFT JOIN tbl_link_products_brands ON lpb_p_id = p_id
LEFT JOIN tbl_link_products_authors ON lpa_p_id = p_id
LEFT JOIN tbl_link_products_narrators ON lpn_p_id = p_id
LEFT JOIN tbl_linkfiles ON lf_id = p_id
AND (
lf_table = 'tbl_products'
OR lf_table IS NULL
)
LEFT JOIN tbl_files ON lf_file_id = file_id
AND (
file_nameid = 'p_main_image_'
OR file_nameid IS NULL
)
WHERE p_live = 'y'
ORDER BY p_title_clean ASC, p_title ASC
LIMIT 0 , 10

1 Ответ

1 голос
/ 28 марта 2012

Можно попытаться уменьшить размер объединений, используя производную таблицу для извлечения отфильтрованных и упорядоченных продуктов перед объединением.Это предполагает, что p_live, p_title_clean и p_title являются полями в вашей таблице tbl_products -

SELECT * 
FROM (SELECT * 
    FROM tbl_products
    WHERE p_live = 'y'
    ORDER BY p_title_clean ASC, p_title ASC
    LIMIT 0 , 10
) AS tbl_products
LEFT JOIN tbl_link_products_categories
    ON lpc_p_id = p_id
LEFT JOIN tbl_link_products_brands
    ON lpb_p_id = p_id
LEFT JOIN tbl_link_products_authors
    ON lpa_p_id = p_id
LEFT JOIN tbl_link_products_narrators
    ON lpn_p_id = p_id
LEFT JOIN tbl_linkfiles
    ON lf_id = p_id
    AND (
        lf_table = 'tbl_products'
        OR lf_table IS NULL
    )
LEFT JOIN tbl_files
    ON lf_file_id = file_id
    AND (
        file_nameid = 'p_main_image_'
        OR file_nameid IS NULL
    )

Это «удар в темноте», поскольку в вашем вопросе недостаточно подробностей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...