如何提高拥有50万条记录并增长

时间:2015-07-03 10:20:26

标签: mysql sql database-performance

我们有两个表,表A和表B(包含5000万条记录)。在表A中,我们存储了商家的唯一值。从那里,我们从表B中获取记录。如何提高查询性能以及提高性能的方法有哪些?

注意:两个表的表结构都很简单 表A - 存储引擎(MyISAM)
表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 个答案:

答案 0 :(得分:2)

如果您还没有这样做,请在table_a.merchant_idtable_a.field_date上添加索引。 还要在table_2.field_b1上添加索引。

此外,您可以尝试使用select中的记录在table_bjoin上创建主table_a。类似的东西:

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个主查询+谁知道在第一个记录中找到的每条记录有多少额外查询。

答案 1 :(得分: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;

查询应该运行得更快。