2015-07-03 79 views
0

我們有兩個表,表A和表B(包含5000萬條記錄)。在表A中,我們存儲了一個獨特的商人價值。從那裏,我們從表B中提取記錄。如何提高查詢性能以及如何提高查詢性能?如何提高有5000萬條記錄的表的性能和增長

注意:兩個表的表結構都很簡單。表B--存儲引擎(MyISAM)
表A--我們有一個主鍵與表B的許多記錄相對應。
查詢中使用:
查詢1:

records = "select field1, field2... from table A where merchant_id = '' 
and field_date between '23-06-2012' and '23-06-2015' order by field 1"; 

查詢2:執行環路

foreach (records as records) { 
     "select field_b1, field_b2, .. from table B where field_b1 =  
'records['field1']'" 
    } 
+2

哪裏是你的查詢和什麼是表結構。 –

+2

購買更快的服務器(SSD而不是機械驅動器),給它大量的RAM,配置MySQL使用這樣的硬件。還要別的嗎? –

+1

你沒有給我們很多工作。 – Chavez

回答

2

如果您還沒有這樣做,在table_a.merchant_idtable_a.field_date添加索引。 同時在table_2.field_b1上添加索引。

另外,你可以嘗試從table_atable_b主要selectjoin它的記錄。喜歡的東西:

select 
B.field_b1, B.field_b2 
from table_b AS B 
LEFT JOIN table_a AS A on B.field_b1 = A.field_1 
WHERE A.merchant_id = '' AND A.field_date between '23-06-2012' and '23-06-2015' 
order by field 1; 

這種方式,你有你所有的記錄,而不是+誰知道在第一個找到的每個記錄有多少附加查詢1個主查詢只有一個查詢。

0

爲了提高性能 你應該通過限制記錄

例如使用分頁。

Select record from table limit 0,10; 

然後你應該選擇特定的數據,你不應該使用

如。

Select data1,data2 from table limit 0,10; 

你應該避免

Select * from table; 
+0

請刪除此答案,您所寫的內容不正確,完全與該問題無關。如果你不知道如何解決問題,你不能給出建議如何解決問題。 LIMIT和SELECT *是不好的建議,它表明你不知道它們是如何工作的。 –

0

您應該將邏輯重寫爲單個查詢。而且,使用ISO標準的日期格式:

select a.field1, a.field2... , b.field1, b.field2, . . 
from a left join 
    b 
    on a.field1 = b.field1 
where a.merchant_id = '' and 
     a.field_date between '2012-06-23' and '2015-06-23' 
order by a.field1; 

對於此查詢,您想對指數:a(merchant_id, field_date, field1)b(field1)

注意:如果您只是在尋找一個日期,請不要使用between。只需使用=

select a.field1, a.field2... , b.field1, b.field2, . . 
from a left join 
    b 
    on a.field1 = b.field1 
where a.merchant_id = '' and 
     a.field_date = '2012-06-23' 
order by a.field1; 

該查詢應該運行得更快。

相關問題