0

我在我的从机上运行这个查询。

询问:

select ID from audit where app='accounts'

解释输出

    +----+-------------+-----------------+------+---------------+------+---------+------+-----------+-------------+
| id | select_type | table           | type | possible_keys | key  | key_len | ref  | rows      | Extra       |
+----+-------------+-----------------+------+---------------+------+---------+------+-----------+-------------+
|  1 | SIMPLE      | IAMAccountAudit | ALL  | NULL          | NULL | NULL    | NULL | 155658522 | Using where |
+----+-------------+-----------------+------+---------------+------+---------+------+-----------+-------------+

在 Execution 之后,我的从机在主机后面运行。

    *************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 182.31.251.94
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: bin.001487
          Read_Master_Log_Pos: 2967065
               Relay_Log_File: 172-relay-bin.004312
                Relay_Log_Pos: 43303861
        Relay_Master_Log_File: bin.001486
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 43303721
              Relay_Log_Space: 55397036
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 365
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1302078

它一直在增加。

如何避免mysql积压?.

4

1 回答 1

2

如果我有一个表模式可以使用,那会有所帮助。但是,据我所知,您的查询没有使用索引,而是从第一条记录到最后一条记录依次读取表。

由于查询必须检查大约 155,658,522 或 1.55 亿行,这将导致服务器资源耗尽。由于查询在您正在查询的列上没有适当的索引(key=null在解释输出中),因此行将一一获得对它们发出的读锁。

当此读取发生时,MySQL 可能会阻止复制活动,即阻止对正在读取的行的更新。然后,当这些更新无法完成时,MySQL 会将这些更新排队。这个问题是由于服务器的 ACID 合规性而不是线程等。由于我没有诸如引擎之类的表信息,这充其量只是一个有根据的猜测。

建议:

  1. 索引表格上的应用列,让您更快地进行选择。使用 app 列上的索引,MySQL 将对表执行 b-tree 搜索,而不是顺序搜索。您的查询将运行得更快,发出更少的锁,因此它会更快更轻。缺点是它会稍微延迟此表的更新和插入,因为需要维护一个额外的索引。
  2. 除非您需要纳秒级实时复制,否则系统将保持原样。请记住,如果对实时数据没有要求,复制落后不是问题。复制失败要糟糕得多。

希望这个对你有帮助。

于 2013-01-29T10:03:09.650 回答