【问题标题】:mySQL long query lock timeout exceptionmySQL长查询锁超时异常
【发布时间】: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


【解决方案1】:
  • 查询是一个非常糟糕的查询——它必须将table1 的每一行与table2 的每一行配对;这是要测试的 120 0 亿 个东西。很高兴它中止了,而不是运行到本月的第 6 个星期日。
  • OR 是性能杀手,请考虑选择空字符串或 NULL,而不是两者。
  • LIKE '%xx%' 不会使用索引。
  • 考虑使用FULLTEXT 而不是LIKE
  • 2GB 的 RAM 要么意味着 innodb_buffer_pool_size 太小而无法缓存整个表,要么意味着它设置得太高以至于您正在交换。 (交换对于 MySQL 来说很糟糕。)找到该设置的值。
  • UPDATESELECTs 需要并采取更严重的锁。看看你是否可以运行SELECT id FROM tbl WHERE ... 来获取相关行的 id,看看需要多长时间。然后我们可以讨论可能的替代方案。
  • 请为每张桌子提供SHOW CREATE TABLE

底线:重新思考算法。

【讨论】:

  • 嗨 Rick,带有扩展名 postgis 的 postgresql 是否可以进行这样的调用?
  • @KDJ Mysql 默认具有地理空间数据类型和功能。但是您不是在进行任何地理空间操作,而是在进行模式匹配。所以,不,切换到 postgresql 不会解决任何问题。
  • 使用postgresql,表是按顺序存储在堆上的,可能会影响速度
  • 嗨,Shadow,如果我从应用程序而不是数据中进行模式匹配,并且只从两个表中读取,如果满足我可以写 1 乘 1
  • @KDJ - 表格的顺序无关紧要,因为它必须扫描每一行。
猜你喜欢
  • 2022-10-13
  • 2015-10-13
  • 2020-09-15
  • 2011-11-20
  • 1970-01-01
  • 1970-01-01
  • 2021-10-15
  • 2016-06-20
  • 2011-01-14
相关资源
最近更新 更多