MySQL查询太慢或超时

时间:2015-06-22 09:53:58

标签: mysql laravel-5

我对我的申请做了一个完整的噩梦。我之前没有使用过这么大的数据集,而且我的查询要么超时要么需要很长时间才能返回。我觉得我的做法完全错了。

我有一个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

邮政编码字段是PRIMARY,我在所有其他字段上都有INDEX。

每个字段(除邮政编码外)都有一个查找表。在country的情况下,它就像是;

code   | description
S99999   Wales

申请的要点是用户可以选择感兴趣的领域(例如“英格兰”,“伦敦”,“西南英格兰”等)并显示这些区域的付款结果。

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

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

更新

这是我的代码;

$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在这里做了什么。我不知道为什么完整的查询没有打印出来。

1 个答案:

答案 0 :(得分:0)

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