mySQL长查询锁定超时异常

时间:2017-07-18 22:57:42

标签: mysql sql amazon-web-services

请帮助我,我得到了这个例外

      Lock wait timeout exceeded; try restarting transaction

我正在运行此查询。

    UPDATE Table1 INNER JOIN Table2
    SET Table1.xCoord = Table2.Longitude, Table1.yCoord = Table2.Latitude,
    Table1.location2 = CONCAT(Table2.Street, ', ', Table2.Post_Town, ', ', 
    Table2.County, ', ', Table2.Postcode, ', UK ')
    WHERE (Table1.location2 = '' OR Table1.location2 IS NULL) AND 
    (Table1.location1 LIKE CONCAT('%', Table2.Street, '%'))
    AND (Table2.location1 LIKE CONCAT('%', Table2.Post_Town, '%'));

表2是3000万行,表1是4000行(可能增加)。我在1. street 2. town上有一个索引。回答Rick Ive给出的示例表。

  • 表1

|位置1 ||位置2 ||邮政编码

|| flat 30 234 harddrive street morganvale ||(new string add)||

  • 表2

||房子没有||街||镇||邮政编码|| xcoord || ycoord ||

|| 234 || harddrive street || morganvale || mr12 123 || 5.1234 || 24.2345 ||

我使用LIKE模式匹配街道名称和城镇。已删除逗号,并且location1全部为小写。

我使用AWS并拥有100GB存储空间以提高写入速度,而且我使用的是带有2GB RAM的t2.small。

我的问题是,可以使此查询运行得更快,如何防止锁等待超时异常。查询是否正确?

查询的目的是从table2中的3000万个文件向table1添加x和y坐标以及位置。

我一直在考虑一些替代方案?将postgre postgis运行此查询比mysql更快。如何处理来自诸如java之类的应用程序的表的连接。

1 个答案:

答案 0 :(得分:2)

  • 查询是一个非常恶魔的问题 - 它必须将table1的每一行与table2的每一行配对;那要测试120个十亿的东西。很高兴它流产而不是一直跑到本月的第六个星期天。
  • OR是性能杀手,考虑选择空字符串或NULL,而不是两者。
  • LIKE '%xx%'不会使用索引。
  • 请考虑使用FULLTEXT代替LIKE
  • 2GB的RAM意味着innodb_buffer_pool_size太小而无法缓存整个表,或者设置得太高而无法进行交换。 (对于MySQL,交换非常糟糕。)找到该设置的值。
  • UPDATE需要并且比SELECTs采取更严重的锁定。看看您是否可以运行SELECT id FROM tbl WHERE ...来获取相关行的ID,并查看需要多长时间。然后我们可以讨论可能的替代方案。
  • 请为每张表提供SHOW CREATE TABLE

底线:重新思考算法。