作者clubflymf (clubfly)
看板Database
标题Re: [SQL ] 大量删除资料的问题
时间Tue Jun 9 16:48:30 2009
硬是要用 sql 做出来的话...
似乎有一点难度..
$sql = "select id,
url_id
from url_detail_history
where url_id in (
select url_id
from fx01
group by url_id
having count(*) > 1500
)
order by url_id,id"
这可以直接抓出您想删的资料群组
您再将他用程式处理
如
$rs = mysql_query($sql);
$sv = '';
while ($ar = mysql_fetch_array($rs)){
if ($sv != $ar['url_id']){
$i=1;
} else {
$i++;
if ( $i < 1500 ){
$del = "delete from url_detail_history
where id = '".$ar['id']."' ";
mysql_query($del);
}
}
$sv = $ar['url_id'];
}
不过子查询 对 server 小吃力就是了...
当然也是可以加速
不过会偏向程式直接算
如
$sql = "select count(*) , url_id
from url_detail_history
group by url_id
having count(*) > 1500 ";
$rs = mysql_query($sql); //先抓出那些是异常群组
while ( $ar = mysql_fetch_array($rs)){
$sql2 = " select id , url_id
from url_detail_history
where url_id='".$ar['url_id']."' "
$rs2 = mysql_query($sql2);
$i = 0;
while ( $ar2 = mysql_fetch_array($rs2)){
$i++;
if ( $i < 1500 ){
$a[$ar2['id']] = 'X';
}
}
}
//删除错误资料
foreach ($a as $key => $val){
$del = "delete from url_detial_history
where id = '".$key."' ";
mysql_query($del);
}
大概就这样子了...@@
※ 引述《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)
: }
: 这样作法效能很差,不想这麽暴力解这个问题,
: 想请教前辈不知道有没有比较好的办法...谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.32.116.173
※ 编辑: clubflymf 来自: 114.32.116.173 (06/09 16:53)
※ 编辑: clubflymf 来自: 114.32.116.173 (06/09 16:54)