(一个迟到的答案,但是当人们在谷歌中发现这个问题时总是很高兴)
无需更改 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