MySQL查询速度太慢或超时
问题描述:
我对我的应用程序有一个完整的噩梦。我之前没有处理过这么大的数据集,而且我的查询要么超时,要么花时间回报一些东西。我有一种感觉,我的方法是完全错误的。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在这里做了什么。我不知道为什么完整的查询不打印出来。
答
如果你有太多的结果像100万,那么使用偏移限制的概念。然后它将为您节省查询时间。还要确保你选择的查询只是过滤了必填字段(避免从XXXX选择*,使用XXX中的选择A,B)。
您的查询是在哪里? –
没有看到您的查询我猜左边的联接可能是问题。你为什么需要这个?当您对付款完成感兴趣时,您可以使用正常的JOIN来代替? – Olli
添加查询以及解释计划..'解释选择...' –