如何加快MySQL查询速度或更改它以使其更快?

时间:2017-03-07 04:06:15

标签: mysql sql

示例SQLFiddle:http://sqlfiddle.com/#!9/ba20f/2

该示例在2个表中每个表中只有5行,但加载IMO仍然需要很长时间。希望它能让我插入更多,这将增加时间和更多行和数据......

此查询需要很长时间才能完成。 wp_quantum_purchaseswp_quantum_sales中的行数各约为11,000。 wp_hunter_quote_partswp_hunter_quotes表完全为空(因为这是为了在系统中存储数据)。

因此,我已将其他系统(购买和销售)的数据导入到单独的表中。我需要做的是能够仅显示购买和销售表的IsActive = 1部分,但是,如果wp_hunter_quote_parts表具有这些部分(ItemName),那么它应该拉出而是来自wp_hunter_quote_partswp_hunter_quotes表的数据。我在这里有3个全外连接,但我觉得这可以做到这样,加载数据不需要超过90秒。特别是,因为我一次使用限制为40个。

(SELECT IFNULL(qp.ItemName, qs.ItemName) AS name, IFNULL(qp.TimeAdded, qs.TimeAdded) AS created, qs.SalesDate AS effective, qp.VendorName AS supplier, qp.Source AS source, qp.VendorType AS type, qp.Price AS cost, qs.Price AS price, CAST((((CAST(qs.Price AS DECIMAL(10,2)) - CAST(qp.Price AS DECIMAL(10,2))) / CAST(qp.Price AS DECIMAL(10,2))) * 100) AS DECIMAL(10,2)) AS markup, qs.CustomerName AS customer, qs.CustomerListID AS customerListID, qp.VendorListID AS vendorListID, '' AS itemListID
                FROM wp_quantum_purchases AS qp
                LEFT JOIN wp_quantum_sales AS qs ON (qs.ItemName = qp.ItemName AND qs.IsActive = 1)
                WHERE qp.IsActive = 1 AND NOT EXISTS (
                    SELECT 1
                    FROM wp_hunter_quote_parts AS hqp
                    WHERE qp.ItemName = hqp.ItemName AND hqp.IsActive = 1
                )
            )
            UNION ALL
(SELECT IFNULL(qp.ItemName, qs.ItemName) AS name, IFNULL(qp.TimeAdded, qs.TimeAdded) AS created, qs.SalesDate AS effective, qp.VendorName AS supplier, qp.Source AS source, qp.VendorType AS type, qp.Price AS cost, qs.Price AS price, CAST((((CAST(qs.Price AS DECIMAL(10,2)) - CAST(qp.Price AS DECIMAL(10,2))) / CAST(qp.Price AS DECIMAL(10,2))) * 100) AS DECIMAL(10,2)) AS markup, qs.CustomerName AS customer, qs.CustomerListID AS customerListID, qp.VendorListID AS vendorListID, '' AS itemListID
                FROM wp_quantum_sales AS qs
                LEFT JOIN wp_quantum_purchases AS qp ON (qp.ItemName = qs.ItemName AND qp.IsActive = 1)
                WHERE qs.IsActive = 1 AND NOT EXISTS (
                    SELECT 1
                    FROM wp_hunter_quote_parts AS hqp
                    WHERE qs.ItemName = hqp.ItemName AND hqp.IsActive = 1
                )
            )
            UNION ALL 
(SELECT hqp.ItemName AS name, hq.Quote_Date AS created, hqp.SalesDate AS effective, hqp.VendorName AS supplier, hqp.Source AS source, hqp.VendorType AS type, hqp.Cost AS cost, hqp.Price AS price, CAST((((CAST(hqp.Price AS DECIMAL(10,2)) - CAST(hqp.Cost AS DECIMAL(10,2))) / CAST(hqp.Cost AS DECIMAL(10,2))) * 100) AS DECIMAL(10,2)) AS markup, IFNULL(hq.Customer_FullName, 'N/A') AS customer, hq.Customer_ListID AS customerListID, hqp.VendorListID AS vendorListID, hqp.Item_ListID AS itemListID
                FROM wp_hunter_quote_parts AS hqp
                LEFT JOIN wp_hunter_quotes AS hq ON (hq.id = hqp.QuoteID)
                WHERE hqp.IsActive = 1)

ORDER BY name ASC
LIMIT 0, 40;

有人可以帮我吗?我需要将购买和销售表合并到一个组合表中(这样做......但无疑是非常慢),而且需要对hunter_quote_parts表进行外连接,以便hqp.IsActive = 1存在,而不是我们需要从wp_hunter_quote_parts表中提取数据而不是从其他2个表中提取数据。

如何使此查询更快地运行或更改它以使其功能相同但更快?请有人帮忙吗?

如果可能的话,最好的解决方案是使用类似的东西:

SELECT *
FROM wp_quantum_purchases AS qp, wp_quantum_sales AS qs
LEFT JOIN wp_hunter_quote_parts AS hqp ON ((hqp.ItemName = qp.ItemName || hqp.ItemName = qs.ItemName) AND hqp.IsActive = 1)
LEFT JOIN wp_hunter_quotes AS hq ON (hq.id = hqp.QuoteID)
WHERE qp.IsActive = 1 || qs.IsActive = 1;

但是,此查询的问题在于它依赖于wp_quantum_purchaseswp_quantum_sales在其中包含IsActive = 1的行,然后才能从{{1}中获取任何数据}或wp_hunter_quote_parts表。这是一个不可接受的查询,因为它需要捕获在我的系统中向前移动的数据,并且将在wp_hunter_quoteswp_hunter_quotes表内捕获向前移动的数据。 wp_hunter_quote_parts可能是量子表中甚至不存在的新项。虽然如果引号表中不存在,我需要显示ItemNamewp_quantum_purchases中的先前数据(如果存在)。怎么会有人这么想?这似乎是非常基本的,应该可以做到,但为什么这么难理解?而且除此之外,我发现为此工作的查询花了太长时间才完成。不知道你还需要什么...?

0 个答案:

没有答案