我不知道如何阻止我的查询超时。我有两张桌子。一个包含付款详细信息,包括邮政编码字段。 payments
表的示例;
id (PRI) | company_name | amount | postcode
1 ACME 10000 AB1 1AA
2 Some Int. 15000 ZY9 8XW
另一个表是一个查找表,它将地理区域分配给邮政编码。 postcode
表的示例;
postcode | country | county | local_authority | gor
AB1 1AA S99999 E2304 X 45
AB1 1AB S99999 E2304 X 45
因此,如果用户在country = S99999
上进行搜索,则会返回该国家/地区的所有付款。
payments
表有40,000行。 postcode
表超过2,500,000。即使这个非常简单的查询也会超时;
SELECT t1.company_name, t1.amount, t1.postcode, t2.country, t2.county, t2.local_authority, t2.gor
FROM `payments` as t1 LEFT JOIN `postcodes` AS t2 ON t1.`postcode` = t2.`postcode`
我在两个表的postcode
个字段上都有一个INDEX。我无法手动将查找字段添加到我的payments
表中,因为它们是每个季度的不同查找。
我在这里的经历有限。我无法想到替代方案或方法。有什么想法吗?
答案 0 :(得分:1)
我也会从我的评论中回答:
我认为你的'LEFT JOIN'是杀手。现在,将其更改为正常的“JOIN”。还有时间吗? :)
您可能想要使用查询创建视图。第一次它会很慢,但数据将(可能)在缓存中可用。但您可能想要阅读有关DBMS的文档。 :)
用户是否始终必须执行搜索才能触发此查询?你可能想试试这个:
SELECT * FROM payments WHERE postcode IN (SELECT postcode FROM postcode WHERE (country='S99999'));
编辑:嵌套查询可能需要更多内存。 :)
答案 1 :(得分:0)
目前尚不清楚您使用的是什么数据库,但是在SQL服务器的情况下: