推 roga:好方法 ^^ 06/09 15:48
※ 編輯: bobju 來自: 203.67.139.64 (06/15 12:51)
//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
//所以應該可以才是.
$sql=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)
: }
: 這樣作法效能很差,不想這麼暴力解這個問題,
: 想請教前輩不知道有沒有比較好的辦法...謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 203.67.139.64