SQL查询将超时

时间:2015-08-04 10:54:27

标签: mysql

我不知道如何阻止我的查询超时。我有两张桌子。一个包含付款详细信息,包括邮政编码字段。 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表中,因为它们是每个季度的不同查找。

我在这里的经历有限。我无法想到替代方案或方法。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我也会从我的评论中回答:

我认为你的'LEFT JOIN'是杀手。现在,将其更改为正常的“JOIN”。还有时间吗? :)

您可能想要使用查询创建视图。第一次它会很慢,但数据将(可能)在缓存中可用。但您可能想要阅读有关DBMS的文档。 :)

用户是否始终必须执行搜索才能触发此查询?你可能想试试这个:

    SELECT * FROM payments WHERE postcode IN (SELECT postcode FROM postcode WHERE (country='S99999'));

编辑:嵌套查询可能需要更多内存。 :)

答案 1 :(得分:0)

目前尚不清楚您使用的是什么数据库,但是在SQL服务器的情况下:

  1. 限制返回的回忆次数(TOP子句)
  2. 使用提示NO LOCK来提高查询速度
  3. 增加查询的命令超时,但不再超过该网页超时
  4. 不要使用LEFT JOIN,这很慢
  5. 使用临时表(或在内存表中),在哪里存储来自两个表的数据而不仅仅是过滤数据