(遅い答えですが、人々がグーグルでこの問題を見つけたときにそれを持っているのは常に良いことです)
innodb_buffer_pool_sizeを変更したり、インデックスを作成したりせずに解決できるのは、削除する行の数を制限することです。
たとえば、あなたの場合DELETE from pricedata where pricedata > '20120413' limit 100;
です。これにより、100行が削除され、167行が残ります。したがって、同じクエリを再度実行して、別の100を削除できます。最後の67では、注意が必要です...データベースに残っている行の数が指定された制限より少ない場合、次の数に関するエラーが発生します。ロックします。おそらく、サーバーが100まで満たすためにさらに一致する行を検索するためです。この場合、を使用limit 67
して最後の部分を削除します。limit 267
(もちろん、最初から使用することもできます)
そして、スクリプトを書くのが好きな人のために...古いデータをクリーンアップするためにbashスクリプトで使用した良い例:
# Count the number of rows left to be deleted
QUERY="select count(*) from pricedata where pricedata > '20120413';"
AMOUNT=`${MYSQL} -u ${MYSQL_USER} -p${MYSQL_PWD} -e "${QUERY}" ${DB} | tail -1`
ERROR=0
while [ ${AMOUNT} -gt 0 -a ${ERROR} -eq 0 ]
do
${LOGGER} " ${AMOUNT} rows left to delete"
if [ ${AMOUNT} -lt 1000 ]
then
LIMIT=${AMOUNT}
else
LIMIT=1000
fi
QUERY="delete low_priority from pricedata where pricedata > '20120413' limit ${LIMIT};"
${MYSQL} -u ${MYSQL_USER} -p${MYSQL_PWD} -e "${QUERY}" ${DB}
STATUS=$?
if [ ${STATUS} -ne 0 ]
then
${LOGGER} "Cleanup failed for ${TABLE}"
ERROR=1
fi
QUERY="select count(*) from pricedata where pricedata > '20120413';"
AMOUNT=`${MYSQL} -u ${MYSQL_USER} -p${MYSQL_PWD} -e "${QUERY}" ${DB} | tail -1`
done