2017-09-04 26 views
0

我有一些問題與找到一個令某些過濾器的下一個ID就可以查詢 - 就像它應該是從一個特定城市等PHP - SQL優化最小/最大速度太慢

目前,它被用於一個功能,它會根據當前的順序吐出前一個或下一個ID。所以它可以是min(id)或max(id),其中max(id)明顯更快,因爲它必須經歷更少的行。

該查詢工作得很好,但它很慢,因爲它要經過123953行來查找ID。有什麼辦法可以優化這個嗎?

功能例如:

SELECT $minmax(orders.orders_id) AS new_id FROM orders LEFT JOIN orders_status ON orders.orders_status = orders_status.orders_status_id $where_join WHERE orders_status.language_id = '$languages_id' AND orders.orders_date_finished != '1900-01-01 00:00:00' AND orders.orders_id $largersmaller $ordersid $where; 

活生生的例子

SELECT min(orders.orders_id) 
FROM orders 
LEFT JOIN orders_status ON orders.orders_status = orders_status.orders_status_id 
WHERE orders_status.language_id = '4' 
    AND orders.orders_date_finished != '1900-01-01 00:00:00' 
    AND orders.orders_id < 4868771 
LIMIT 1 
+1

對orders.orders_id有一個索引並刪除orders_products和products的連接。無論如何你都不使用這兩張表。 where子句將你的左連接變爲orders_status成爲內連接,順便說一句。 – fancyPants

+0

是date_finished的關鍵嗎?那麼這個日期怎麼會是1900-01-01?除非你正在處理一些歷史數據,否則NULL不會是更多的邏輯值(因爲我認爲這是1900年左右) –

+0

@IvoP這是一個真實的遺留系統,充滿了缺陷 - 因此,爲什麼它不是完全邏輯的或最佳 – Dandersen

回答

0

這樣的結論:

SELECT orders.orders_id 
FROM orders 
JOIN orders_status ON orders.orders_status = orders_status.orders_status_id 
WHERE orders_status.language_id = '4' 
    AND orders.orders_date_finished != '1900-01-01 00:00:00' 
    AND orders.orders_id < 4868771 
ORDER BY orders.orders_id ASC 
LIMIT 1 

附加:

,以獲得最大價值,使用DESC其中ASC是現在。

並看着你的問題:一定要逃避像$ language_id etcetera這樣的值。我想他們可能來自一些HTML表單? (或使用預先準備好的語句)