2017-05-04 120 views
0

我的查詢太慢了。這需要一分多鐘。我如何快速創建查詢? 你能幫我嗎?我的查詢太慢

select * from nss_sikdan_ok where od_id in(
    select od_id from nss_order od 
    join nss_cart ct on od.on_uid=ct.on_uid 
    where ct.ct_status in('cart','sell')) and (DATE_FORMAT(today_end_date,'%Y-%m-%d')='2017-05-05') and today_end='1' limit 0,1 
+0

https://tools.percona.com/query-advisor/PTBJITIG/advise粘貼查詢這裏得到一些整體的想法和優化技巧 – Ognj3n

回答

0

有幾件事情可以做,以優化此查詢。

在查詢方面:

避免調用上潛在的索引列功能 - 因爲它不會讓MySQL使用索引該列。以下條件:

DATE_FORMAT(today_end_date,'%Y-%m-%d')='2017-05-05' 

可以被修飾以這一個,以避免使用索引列上的所述DATE_FORMAT功能,而是僅使用功能上的恆定值:

today_end_date >= DATE('2017-05-05') AND today_end_date < (DATE('2017-05-05') + INTERVAL 1 DAY) 

====

請勿在查詢中使用OFFSET值 - 您可以使用faster pagination with offset in MySQL的替代方法,而不是LIMIT X,Y。

===

避免選擇不使用的列 - 在大多數情況下,選擇使用「*」操作符會導致性能問題,因爲你獲取更多的信息比實際需要的所有列。考慮在結果集中實際需要哪些列並獲取它們。

===

使用數值在適當的時候 - 當數字列比較字符串,你迫使MySQL來從數轉換列的值,每行一個字符串,然後才執行比較。因此,在條件today_end = '1',如果today_end數值列,所述條件應該是:

today_end = 1 

代替:

today_end = '1' 

===

此外,如果你可以提供模式結構,這將有可能爲這種情況推薦適當的索引。

順便說一句,我得到了online MySQL query optimizer的建議,所以請隨時輸入您的查詢和架構,並獲得索引建議。

0

看一看的explain output該查詢,它應該給你約指標的一些見解所用或不