2015-06-22 147 views
0

我对我的应用程序有一个完整的噩梦。我之前没有处理过这么大的数据集,而且我的查询要么超时,要么花时间回报一些东西。我有一种感觉,我的方法是完全错误的。MySQL查询速度太慢或超时

我有一个payments表和postcode字段(等等)。它有大约40,000行(每笔交易一个)。它在邮编外键上有一个auto-inc PRIMARY键和一个INDEX。

我也有一个postcodes查询表,2,500,000行。桌子是这样构成的;

postcode | country | county | localauthority | gor 
AB1 1AA S99999 E2304  X    45 
AB1 1AB S99999 E2304  X    45 

邮政编码字段是主要的,我在所有其他领域的索引。

每个字段(除了邮编)都有一个查找表。在country的情况下是这样的;

code | description 
S99999 Wales 

应用程序的一点是,用户可以选择感兴趣的区域(如“英格兰”,“伦敦”,“英格兰西南部”等),并显示这些区域的支付结果。

为此,当用户选择他们感兴趣的区域时,我创建了一个临时表,其中一行列出了所选区域的所有邮编。然后我将它加入我的付款表。

问题是,如果用户选择一个大区域(如“英格兰”),那么我必须创建一个大规模临时表(或约100万行),然后将其与40,000个支付款项进行比较以决定要显示哪个。

UPDATE

这里是我的代码;

$generated_temp_table = "selected_postcodes_".$timestamp_string."_".$userid; 
    $temp_table_data = $temp_table 
    ->setTempTable($generated_temp_table) 
    ->newQuery() 
    ->with(['payment' => function ($query) use ($column_values) { 
     $query->select($column_values); 
    }]) 
    ; 

这是我试图打印出原始查询;

$sql = str_replace(['%', '?'], ['%%', "'%s'"], $temp_table_data->toSql()); 
    $fullSql = vsprintf($sql, $temp_table_data->getBindings()); 
    print_r($fullSql); 

这是结果;

select * from `selected_postcodes_1434967426_1` 

这看起来不是正确的查询,我无法计算出Eloquent在这里做了什么。我不知道为什么完整的查询不打印出来。

+3

您的查询是在哪里? –

+0

没有看到您的查询我猜左边的联接可能是问题。你为什么需要这个?当您对付款完成感兴趣时,您可以使用正常的JOIN来代替? – Olli

+0

添加查询以及解释计划..'解释选择...' –

回答

0

如果你有太多的结果像100万,那么使用偏移限制的概念。然后它将为您节省查询时间。还要确保你选择的查询只是过滤了必填字段(避免从XXXX选择*,使用XXX中的选择A,B)。