对于我们来说,DELETE WHERE %s ORDER BY %s LIMIT %d
答案不是一个选择,因为WHERE标准很慢(一个非索引列),并且会达到标准。
从只读副本中选择要删除的主键列表。以这种格式导出:
00669163-4514-4B50-B6E9-50BA232CA5EB
00679DE5-7659-4CD4-A919-6426A2831F35
使用以下bash脚本抓取此输入并将其分块为DELETE语句[由于mapfile
内置需要bash≥4 ]:
sql-chunker.sh
(记住chmod +x
我,将shebang更改为指向您的bash 4可执行文件):
#!/usr/local/Cellar/bash/4.4.12/bin/bash
: <<!
00669163-4514-4B50-B6E9-50BA232CA5EB
00669DE5-7659-4CD4-A919-6426A2831F35
!
if [ -z "$1" ]
then
echo "No chunk size supplied. Invoke: ./sql-chunker.sh 1000 ids.txt"
fi
if [ -z "$2" ]
then
echo "No file supplied. Invoke: ./sql-chunker.sh 1000 ids.txt"
fi
function join_by {
local d=$1
shift
echo -n "$1"
shift
printf "%s" "${@/#/$d}"
}
while mapfile -t -n "$1" ary && ((${#ary[@]})); do
printf "DELETE FROM my_cool_table WHERE id IN ('%s');\n" `join_by "','" "${ary[@]}"`
done < "$2"
像这样调用:
./sql-chunker.sh 1000 ids.txt > batch_1000.sql
这将为您提供一个输出格式如下的文件(我使用的批处理大小为2):
DELETE FROM my_cool_table WHERE id IN ('006CC671-655A-432E-9164-D3C64191EDCE','006CD163-794A-4C3E-8206-D05D1A5EE01E');
DELETE FROM my_cool_table WHERE id IN ('006CD837-F1AD-4CCA-82A4-74356580CEBC','006CDA35-F132-4F2C-8054-0F1D6709388A');
然后执行如下语句:
mysql --login-path=master billing < batch_1000.sql
对于不熟悉的用户login-path
,它只是无需在命令行中输入密码即可登录的快捷方式。