一个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(
(一个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(
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
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万的大表
现在我准备用临时表
临时表是否会提高速度???
+-------------------------+-------+
| Variable_name | Value |
+-------------------------+-------+
| table_lock_wait_timeout | 50 |
+-------------------------+-------+
1 row in set (0.00 sec)mysql>如果想提高速度,那得跟踪下语句的性能看看,例如索引是否合理利用
有时,还要考虑改变处理逻辑,如1楼的就是一种改变处理逻辑的思想
这个语句非常头疼, 现状描述
在线db 上 SessionLog500万,一执行所有的update 这个表或者都锁住了
(另外这个表几乎每秒都在不停的插入新数据 )这个必须迫切的解决 ,否则我的工程代码无法应用到在线工程里
这个(select max(lastaccess) mtime, ip ,Id from SessionLog group by Id )结果大吗?
如果不是特别大的话,考虑把这个表放进一个临时表,然后再建立索引,然后再与a表进行关联来update
mysql嵌套能力好弱