一个sql执行速度太长导致的问题 ,确实好慢 
(一个sql 
分3个子操作, 
truancate 
insert ..... 
update....  有时候 执行速度过长的 
) java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1056) 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:957) 
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3376) 
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3308) 
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1837) 
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1961) 
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2543) 
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1737) 
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2022) 
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1940) 
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1925) 
at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeUpdate(

解决方案 »

  1.   

    上次好象有人问过类似的问题。解决的方法是把这个 update 分成多个
    update xxx set xx=yy where id>1000 and id <9000
    分成
    update xxx set xx=yy where id>=1000 and id <2000
    update xxx set xx=yy where id>=2000 and id <3000
    ...
    update xxx set xx=yy where id>=8000 and id <9000
      

  2.   

    现在我把truancate
    insert .....   2个更换为replaceupdate这个没有办法  是在太长。(不知道如何进行作 )附后
    static{
    optimizeSqlList.add("Truncate table a");
    optimizeSqlList.add("insert into `a` ( 。 from UserEntity");
    optimizeSqlList.add("update a inner join (select max(lastaccess) mtime, ip ,Id from SessionLog group by Id ) b On a.id=b.Id set a.ip=b.ip");
    }  这里SessionLog 是一个800万的大表
      

  3.   

    这个sql太漫了我用过内存表 但是发现要改系统参数 最终放弃
    现在我准备用临时表
    临时表是否会提高速度???
      

  4.   

    你是解决超时呢?还是想提高速度呢?你的那个报错是超时了,可以设置下系统变量:mysql> show variables like 'table_lock%';
    +-------------------------+-------+
    | Variable_name           | Value |
    +-------------------------+-------+
    | table_lock_wait_timeout | 50    |
    +-------------------------+-------+
    1 row in set (0.00 sec)mysql>如果想提高速度,那得跟踪下语句的性能看看,例如索引是否合理利用
    有时,还要考虑改变处理逻辑,如1楼的就是一种改变处理逻辑的思想
      

  5.   

    我的目的 提高速度optimizeSqlList.add("update a inner join (select max(lastaccess) mtime, ip ,Id from SessionLog group by Id ) b On a.id=b.Id set a.ip=b.ip"); 
    这个语句非常头疼, 现状描述
    在线db 上  SessionLog500万,一执行所有的update 这个表或者都锁住了
    (另外这个表几乎每秒都在不停的插入新数据 )这个必须迫切的解决 ,否则我的工程代码无法应用到在线工程里
      

  6.   

    因为不是很清楚的逻辑及数据分布,很难给你准确分析
    这个(select max(lastaccess) mtime, ip ,Id from SessionLog group by Id )结果大吗?
    如果不是特别大的话,考虑把这个表放进一个临时表,然后再建立索引,然后再与a表进行关联来update
      

  7.   

    用临时表解决
    mysql嵌套能力好弱
      

  8.   

    是啊 分解sql语句 或者合并sql语句 更改表字段 更新越少约好 
      

  9.   

    优化你的sql语句 或者 把innodb_lock_wait_timeout这个参数调的再大些