我对我的申请做了一个完整的噩梦。我之前没有使用过这么大的数据集,而且我的查询要么超时要么需要很长时间才能返回。我觉得我的做法完全错了。
我有一个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在这里做了什么。我不知道为什么完整的查询没有打印出来。
答案 0 :(得分:0)
如果你有太多的结果,如100万,那么使用偏移限制概念。然后它将节省您的查询时间。另外请确保在您选择查询时只过滤必填字段。(避免从XXXX中选择*。使用XXX中的选择A,B)。