-1

大きなテーブルで多くの行を削除するのに問題があります。2m 行のテーブルから 200 ~ 300k 行を削除しようとしています。

私のPHPスクリプトは次のようなものです

    for($i=0;$i<1000;$i++){
    $query="delete from record_table limit 100";
    $queryres=mysql_query($query) or die(mysql_error());;
}

これは、100k レコードを削除するために 1000 回実行して一度に 100 行を削除するスクリプトの単なる例です。

ただし、PHP スクリプトは永久に実行され続け、何も返されないようです。しかし、コマンド ラインからクエリを実行しようとすると、削除に 5 ~ 6 分ほどかかりますが、問題なく削除されているようです。

PHPスクリプトがクエリを実行するのを妨げている何かが他にありますか? 1つのクエリで100kを削除しようとしましたが、結果も同じです。

私が本当に実行したかったクエリは、「DELETE FROM table WHERE (timeinlong BETWEEN 'timefrom' AND 'timeto'」です。

timeinlong 列にはインデックスが付けられます。

4

3 に答える 3

0

おそらく、削除されたアイテムを追跡するためのフィールドを追加するとうまくいくでしょう。次に、実際に行を削除するのではなく、'deleted' を TRUE に更新します。明らかに、他のクエリを変更して、deleted が FALSE に等しい場所を選択する必要があります。しかし、それは速いです。その後、別の機会にスクリプトを使用してデータベースをトリミングできます。

于 2012-12-17T14:52:57.623 に答える
0

Hopefully you have an ID field so you can just do something like this:

 $delete = mysql_query("DELETE FROM records WHERE id > 1000");

That would leave the first 1,000 rows and remove every other entry.

于 2012-12-17T04:54:36.253 に答える
0

ループを何度も使用して削除するのはなぜですか。削除するのは良い方法ではありません。任意の ID (自動インクリメント) がある場合は、それを where 句と共に使用します (例: record_tablewhere id< any ID から削除)

または、ループで削除したい場合は、 set_time_limit(0) 関数を使用して PHP スクリプトを実行し続ける必要があります。

于 2012-12-17T04:56:43.053 に答える