请帮助我,我得到了这个例外
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 ||位置2 ||邮政编码
|| flat 30 234 harddrive street morganvale ||(new string add)||
||房子没有||街||镇||邮政编码|| 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之类的应用程序的表的连接。
答案 0 :(得分:2)
LIKE '%xx%'
不会使用索引。FULLTEXT
代替LIKE
。innodb_buffer_pool_size
太小而无法缓存整个表,或者设置得太高而无法进行交换。 (对于MySQL,交换非常糟糕。)找到该设置的值。UPDATE
需要并且比SELECTs
采取更严重的锁定。看看您是否可以运行SELECT id FROM tbl WHERE ...
来获取相关行的ID,并查看需要多长时间。然后我们可以讨论可能的替代方案。SHOW CREATE TABLE
。底线:重新思考算法。