作者slalala (X票已卖出 别骚扰我啦= =)
看板Database
标题Re: [SQL ] 大量删除资料的问题
时间Tue Jun 9 03:34:37 2009
java的作法(写个大概)
Connection con1 = DriverManager.getConnection(uri,name,password);
Connection con2 = DriverManager.getConnection(uri,name,password);
con2.setAutoCommit(false);
Statement stmt = con1.createStatement();
Statement stmt2 = con2.createStatement();
ResultSet result =
stmt.executeQuery("捞出你要删除的SQL");
while(result.next(){
stmt2.executeUpdate("预删除的SQL");
}
con2.commit();
result.close();
con1.close();
con2.close();
※ 引述《bobju (宝贝猪)》之铭言:
: //1 先检查url_id有没有设索引? 有设没设差很多.
: 设好索引後..
: //2 先把笔数超过N笔的url找出来:
: $link=资料库连线();
: $sql="
: select url_id,count(*) as count
: from url_detail_history
: group by url_id
: having count(*)>1500";
: $rs=mysql_query($sql,$link);
: //3 承2, 用php捞出每一组 url_id,count 再代入另一组sql语法:
: while($r=mysql_fetch_assoc($rs)){
: //以下这种 delete from ... limit 的用法, 我似乎没用过. 但看mysql
: //官网有这种写法: http://dev.mysql.com/doc/refman/5.0/en/delete.html
: //所以应该可以才是.
: sprintf("
: delete
: from url_detail_history
: where url_id=%d
: order by id asc
: limit %d",
: $r['url_id']
: $r['count']-1500
: );
: mysql_query($sql,$link);
: } // end while
: 没测试过, 也没资料可测试. 所以不保证能run, 仅供参考.
: 若有意愿采用风险请自负. ^^!
: ※ 引述《roga (凝视)》之铭言:
: : 环境介绍:使用 DB 是 MySQL
: : 资料表结构:
: : url_detail_history 资料表
: : +--------------+---------------------+------+
: : | Field | Type | Null |
: : +--------------+---------------------+------+
: : | id | bigint(11) unsigned | NO | -> 有 Auto_increment
: : | url_id | int(11) | NO |
: : | visitor_ip | varchar(15) | NO |
: : | visitor_fqdn | varchar(100) | NO |
: : | visitor_time | timestamp | NO | -> CURRENT_TIMESTAMP
: : +--------------+---------------------+------+
: : 现在里面有许多笔资料,
: : SELECT COUNT(id), url_id from url_detail_history GROUP BY url_id
: : 这句语法可以得知每个 url_id 有几笔资料。
: : 因为前几天程式上的疏忽,小弟写错了一些地方,
: : 以至於资料表非常庞大,我想请问板上前辈们,
: : 有没有办法直接用 SQL 语法执行,每个 url_id 只要总数
: : 超过 N 笔资料就删除到只剩下 N 笔为止,
: : 当然, id 越大代表资料越新,必须能从小的 id 开始删起。
: : 我有写一段程式来跑但是效能不彰,
: : loading 飙到 100 多,拉牛上树惨不忍睹..
: : foreach( $url_id ) {
: : do {
: : $ID = SELECT min(id) FROM table WHERE url_id = $url_id
: : $COUNT = (再从资料表算 url_id 有几笔)
: : DELETE FROM table where id = $ID
: : } while( $COUNT < 1501)
: : }
: : 这样作法效能很差,不想这麽暴力解这个问题,
: : 想请教前辈不知道有没有比较好的办法...谢谢
--
╱
◤◥╲ ╱╱
◤◥╲
你 我
│
◤颜 ◥ △_▂△ ___ │/
◤叔 ◣│
敢 就
— — - - ╱ ╲
⊙ ⊙ 动 干
◣_○_◢ ◥
\\\\ \│﹣ ﹣│
◣_皿_◢ 我 你
◥◣◥◣◢
﹙∞) │
/○
//│
◢◤◢◤ 的 的
▁▄▄▄ ◣
╲┴ /─
▄▄▄▁ 马 狗 mroscarψ
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 219.86.130.111