我在尝试限制的繁重的删除查询中使用了它,并且它的运行速度很快.
DELETE table1 FROM table1
JOIN table2 ON table2.id = table1.salesperson_id
JOIN table3 ON table3.id = table2.user_id
JOIN table4 ON table3.office_id = table4.id
WHERE table1.type = "Snapshot"
AND table4.id = 113 OR table4.parent_id =113
AND RAND()<=0.001;
我不知道这是如何工作的.我尝试了广泛的谷歌搜索,但是在以这种方式使用的WHERE子句中,我对RAND()找不到任何东西.
这些文档也都没有给出任何信息.
先感谢您.
附:我正在使用MYSQL 5.5
解决方法:
对于您的联接生成的每一行,都会评估WHERE子句中的表达式.
每次表达式调用RAND()时,该函数将返回一个介于0和1之间的不同随机浮点值.如果此随机值等于或小于0.001,则该术语为true.因此,随机数大约为1000行中的1行.这些将是它将删除的行.而1000行中的其他999条将跳过删除.
顺便说一句,我想您希望WHERE子句带有一些括号以强制执行运算符优先级:
WHERE table1.type = "Snapshot"
AND (table4.id = 113 OR table4.parent_id = 113)
AND RAND()<=0.001;
否则,AND绑定比OR绑定更牢固,因此如果没有这些括号,该表达式将像您以这种方式编写的那样工作:
WHERE (table1.type = "Snapshot"
AND table4.id = 113) OR (table4.parent_id =113
AND RAND()<=0.001);
这意味着将删除所有类型为“ Snapshot”且id = 113的行,而将删除1/1000行的parent_id = 113的行,包括某些类型为“ Snapshot”以外的行.
标签:mysql,random
来源: https://codeday.me/bug/20191012/1903890.html