MySQL:我怎样才能避免mysql积压?

时间:2013-01-29 07:25:06

标签: mysql sql

我在我的奴隶机器上运行此查询。

查询:

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 |
+----+-------------+-----------------+------+---------------+------+---------+------+-----------+-------------+

执行后,我的奴隶机器在主人身后跑。

    *************************** 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积压?

1 个答案:

答案 0 :(得分:2)

如果我有一个表架构可以使用它会有所帮助。但是从我可以看到你的查询没有使用索引,并逐个从第一个记录到最后一个记录顺序读取表。

由于查询必须检查大约155,658,522或1.55亿行,因此会导致服务器资源耗尽。由于查询在您要查询的列上没有适当的索引(解释输出中为key = null),因此行将逐个获取读取锁。

当读取正在进行时,MySQL可能会阻止复制活动,即阻止对正在读取的行的更新。然后,MySQL会将这些更新排队,因为它们无法完成。这个问题是由于服务器的ACID合规性而不是线程等等。由于我没有像引擎这样的表信息,所以这是一个有根据的猜测。

建议:

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