2012-08-27 31 views
3

我想知道什麼是優化的SQL查詢的響應時間包含超過2.000.000記錄建議「以優化SQL查詢的響應時間」

作爲一個表中的最佳解決方案解決方案,我想通過創建一個SQL視圖來創建一個虛擬表(事實上,我更喜歡mysql在今年創建的行的早期搜索,因爲這個應用程序的數據是基於季節的。)

有沒有更好的解決方案或建議?

例如,要查找租金的全部租線12

之前=> SELECT * FROM rent_lines其中rent_id = 12

現在=> 我創建的視圖

CREATE VIEW v_rent_lines 
AS SELECT rent_id, category_id, customer_id, amount .. 
Where rent_lines FROM created_at > = (select starts_on from seasons where current = true) 

select * from v_rent_lines Where rent_id = 12 

注意事項:

  • database e ngine正在使用InnoDB的

  • 我添加索引表(index_rent_lines_on_rent_id,index_rent_lines_on_category_id,index_rent_lines_on_customer_id)

  • 租金有許多rent_lines

+4

我們需要更多的細節來處理。向我們展示有問題的查詢。給我們提供有關表格的模式。 –

+0

這實際上取決於您的數據庫結構以及您想要執行的查詢。另外:「什麼是最好的X」問題往往會在這裏被封閉,因爲他們沒有確切的答案,並導致無休止的討論。請嘗試使您的問題更具體。 – bfavaretto

+1

通常最簡單的解決方案是添加索引並啓用sql引擎緩存(例如查詢緩存),但它僅適用於SELECT查詢。如果SELECT/INSERT比率小於1000/1,答案並不那麼簡單。 – wojciechz

回答

1

在這種情況下的觀點並沒有真正幫助任何東西。作爲開發人員,視圖主要幫助您通過名稱來引用更復雜的查詢,而不必一直重複這些詳細信息。他們並沒有真正幫助MySQL。

您有很多選擇。

  1. 如果你還沒有,確保在那裏rent_id是無論是在指數中唯一場,或在索引中的第一場,你有一個索引。例如:

    create index rent_id_idx on rent_lines (rent_id) 
    
  2. 您可以考慮使用MySQL的分區系統和分區上rent_id

  3. 您可以創建將通過執行類似具有較低基數的指數:

    alter table rent_lines add rent_id_bucket smallint unsigned not null after rent_id; 
    update rent_lines set rent_id_bucket = rent_id>>16; 
    alter table rent_lines add key rent_id_bucket_idx(rent_id_bucket); 
    

    這將讓你做一個查詢,如:

    select * from rent_lines where rent_id_bucket = 16>>16 and rent_id=16