在我們的應用程序中,我們嘗試爲給定的一組參數找到最佳匹配。我們已將這些行分成不同的質量組,這些質量組與總參數集的一部分相匹配。爲了匹配這些不同的組,我們有多個select查詢,如果沒有找到結果,我們隨後會查詢這些查詢,現在我們決定使用UNION ALL和LIMIT 1一起加入它們。來自多個查詢的第一個現有行
SET @size = 4, @price = 18, @category = 'NEW', @weight = 20, @origin = 'France';
(SELECT * FROM product_catalog WHERE quality = 'A1' AND size = @size AND price = @price AND category = @category AND weight = @weight AND origin = @origin LIMIT 1)
UNION ALL
(SELECT * FROM product_catalog WHERE quality = 'A2' AND size = @size AND price = @price AND category = @category AND origin = @origin LIMIT 1)
UNION ALL
(SELECT * FROM product_catalog WHERE quality = 'A3' AND price = @price AND category = @category AND weight = @weight AND origin = @origin LIMIT 1)
UNION ALL
(SELECT * FROM product_catalog WHERE quality = 'A4' AND price = @price AND category = @category AND origin = @origin LIMIT 1)
UNION ALL
... SOME MORE SELECTS ...
LIMIT 1
現在查詢確實按預期運行,但它執行方式比我們當前的解決方案更差。我認爲這與MySQL可能首先執行UNION語句然後意識到它只需要返回第一個語句有關。
你有什麼建議可以幫助加快查詢速度嗎?你認爲有可能將查詢重寫到一個存儲過程,該存儲過程將檢查每個查詢的結果,並在找到結果時立即返回該結果。這會加快查詢速度嗎?
MySQL將評估所有部件。但有些想法:a)如果沒有總體順序,你的最後一個限制可以帶任意聯合的* ANY *未指定的隨機行,所以它不等同於嘗試第一個查詢,並且只有在沒有找到任何時才繼續下一個查詢。 b)如果爲所有組合添加索引,則此查詢應該在<0.2s內運行。不知道它是否已經這樣做了,並且您只需要它以每分鐘1000次的速度運行得更快,但除此之外,您應該首先檢查索引。c)'或','按質量排序',只有一個限制可能會比'union'更快,這取決於索引。 – Solarflare
謝謝你的回答。我擔心你的觀點a),但我不確定是否屬於這種情況。此外,查詢確實運行速度在0.2秒以下,事實上甚至更快,但正如您所猜測的,我總共需要運行該查詢數百萬次。我做了一些重寫,現在我有一個解決方案,它使用一些'ORDER BY'和'(size = @size或size IS NULL)'魔法來結合查詢。 –