【发布时间】:2017-07-18 22:57:42
【问题描述】:
请你帮帮我,我遇到了这个异常
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 ||(添加新字符串)||
- 表 2
||房子没有||街道 ||城镇 ||邮编 ||坐标 ||坐标||
|| 234 ||硬盘街||摩根维尔||先生12 123 || 5.1234 || 24.2345||
我正在使用 LIKE 模式匹配街道名称和城镇。逗号已被删除,location1 全部为小写。
我正在使用 AWS 并拥有 100GB 的存储空间以提高写入速度,并且我正在使用具有 2GB RAM 的 t2.small。
我的问题是,这个查询是否可以运行得更快,如何防止锁定等待超时异常。查询是否正确?
查询的目的是从 table2 中的 3000 万个文件中向 table1 添加 x 和 y 坐标和位置。
我一直在考虑一些替代方案? postgre postgis 将比 mysql 更快地运行此查询。如何从诸如 java 之类的应用程序中处理这种表连接呢?
【问题讨论】:
-
此查询不能使用索引来加速 where 条件。考虑改用全文索引和全文搜索。
-
呃,您的查询在 2 个表之间创建了笛卡尔连接,导致 4000*3000 万条记录无法使用索引。你需要彻底重新考虑这个练习。
-
我们无法评论查询是否正确,因为我们不知道它应该做什么,也不知道您的数据。
-
嗨影子,我正在考虑可能的解决方案,我应该将街道和城镇合并为 1 列,使用较小的表格并执行 1 LIKE %mergedcolumn%。或者,从我的应用程序运行代码可能会更快
-
link 这是一个有用的链接,aws 中的 mysql 花费巨额资金用于高内存和存储,但如果您有高性能的 ec2,您可以将文件上传到集合并从那里读取. 16GB 可以轻松地为您提供每秒 100,000 行,而 aws rds 对我来说大约是每秒 300-500 行
标签: mysql sql amazon-web-services