【问题标题】:MySQL subquery deadlock (kind of)MySQL子查询死锁(种)
【发布时间】:2014-11-17 14:29:54
【问题描述】:

我在运行此查询时遇到问题:

select * from logs l
where l.id in(select max(id) 
from logs
group by usuario_id);    

关于这个结构:

+-----------------+--------------+------+-----+-------------------+----------------+
| Field           | Type         | Null | Key | Default           | Extra          |
+-----------------+--------------+------+-----+-------------------+----------------+
| id              | int(11)      | NO   | PRI | NULL              | auto_increment |
| usuario_id      | int(11)      | YES  | MUL | NULL              |                |
| projeto_id      | int(11)      | YES  | MUL | NULL              |                |
| title           | varchar(500) | YES  |     | NULL              |                |
+-----------------+--------------+------+-----+-------------------+----------------+

我已尝试在 3 个不同的服务器上运行此查询:

mysql> show variables like "%version%";
+-------------------------+-------------------------+
| Variable_name           | Value                   |
+-------------------------+-------------------------+
| innodb_version          | 5.5.40                  |
| protocol_version        | 10                      |
| slave_type_conversions  |                         |
| version                 | 5.5.40-0ubuntu0.12.04.1 |
| version_comment         | (Ubuntu)                |
| version_compile_machine | x86_64                  |
| version_compile_os      | debian-linux-gnu        |
+-------------------------+-------------------------+

哪台是我的个人电脑,另一台是 2 台:

+-------------------------+-------------------------+
| Variable_name           | Value                   |
+-------------------------+-------------------------+
| innodb_version          | 5.5.40                  |
| protocol_version        | 10                      |
| slave_type_conversions  |                         |
| version                 | 5.5.40-0ubuntu0.14.04.1 |
| version_comment         | (Ubuntu)                |
| version_compile_machine | x86_64                  |
| version_compile_os      | debian-linux-gnu        |
+-------------------------+-------------------------+

托管在 digitalocean 和亚马逊上。

在这些系统上,mysql 进程在发送此查询时保持 100% 运行,并且仅在手动停止查询时才停止...

奇怪的是,这个查询在 windows 上运行没有任何问题(使用 wampp mysql)

mysql> SHOW VARIABLES LIKE "%version%";
+-------------------------+------------------------------+
| Variable_name           | Value                        |
+-------------------------+------------------------------+
| innodb_version          | 5.6.12                       |
| protocol_version        | 10                           |
| slave_type_conversions  |                              |
| version                 | 5.6.12-log                   |
| version_comment         | MySQL Community Server (GPL) |
| version_compile_machine | x86_64                       |
| version_compile_os      | Win64                        |
+-------------------------+------------------------------+

这是 MySQL 版本的问题还是操作系统的问题?

【问题讨论】:

    标签: mysql linux windows subquery deadlock


    【解决方案1】:

    听起来你在ubuntu sql数据库中有一堆数据,每个数据库表有多少行?如果您正在为每个 usuario_id 查找最新的 logs.id,它应该会大大减少运行它的查询时间,然后遍历 usuario_ids 并仅在需要时获取标题列。 varchar(500) 是很多数据。

    select l.id,l.usuario_id from logs l
    where l.id in(select max(id) 
    from logs
    group by usuario_id); 
    

    【讨论】:

    • 您好...我在所有这些数据库上都有 350971 条记录(我已经完成了 mysql 转储)... windows wampp 上的查询以 0.650 毫秒返回结果...
    • 您是否尝试运行我的查询,运行需要多长时间?另外你知道ubuntu或windows数据库表上是否有任何索引吗?
    【解决方案2】:

    虽然这不是您问题的直接答案,但可以重写查询以删除子查询:

       SELECT l.*
         FROM logs l
    LEFT JOIN logs lo
           ON lo.id > l.id
          AND lo.usuario_id = l.usuario_id
        WHERE lo.id IS NULL
    

    这至少可以帮助您找出问题的原因。

    另一个(显而易见的)步骤是在 Windows 中使用 MySQL v5.5.40 对相同数据运行原始查询

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-03
      • 1970-01-01
      相关资源
      最近更新 更多