MySQL查询优化

MySQL查询优化,mysql,sql,database,optimization,Mysql,Sql,Database,Optimization,正在寻找有关优化以下查询的帮助。目前似乎有两个瓶颈导致完成查询大约需要90秒。只有5000种产品,所以它不是一个庞大的数据库/表。瓶颈是SQL\u CALC\u FOUND\u行和ORDER BY语句——如果我同时删除这两个语句,运行查询大约需要一秒钟的时间。 我尝试删除SQL\u CALC\u FOUND\u行并运行count()语句,但这也需要很长时间 按照下面的Stackoverflow帖子使用内部连接(我不太熟悉)是最好的方法吗 您可以尝试通过使用派生表在联接之前检索过滤和排序的产品来减

正在寻找有关优化以下查询的帮助。目前似乎有两个瓶颈导致完成查询大约需要90秒。只有5000种产品,所以它不是一个庞大的数据库/表。瓶颈是SQL\u CALC\u FOUND\u行和ORDER BY语句——如果我同时删除这两个语句,运行查询大约需要一秒钟的时间。 我尝试删除SQL\u CALC\u FOUND\u行并运行count()语句,但这也需要很长时间

按照下面的Stackoverflow帖子使用内部连接(我不太熟悉)是最好的方法吗


您可以尝试通过使用派生表在联接之前检索过滤和排序的产品来减小联接的大小。这假设p_live、p_title_clean和p_title是tbl_产品表中的字段-

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
    )

这是一个“暗中刺杀”,因为您的问题中没有足够的细节。

是否需要所有这些联接都是左联接?你了解内部联接和左联接之间的区别吗?你能给我们看一些CREATETABLE语句吗?你有什么索引?产品不一定需要类别、品牌、作者、讲述人或任何链接文件。。据我所知,在这种情况下我需要使用左连接,对吗?因为如果我使用内部联接,它在某些项目上不会匹配任何内容?是的,这是正确的。我只是想确定你知道其中的区别。请尝试我在下面添加的性能查询。谢谢您,我不得不稍微调整它,但这有助于我了解如何正确地优化它。
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
    )