我有一个包含800万行的表格,需要根据大量的坏词进行扫描。
我的第一个想法是:
UPDATE `master` SET `blacklisted`='1' WHERE MATCH (`content-desc`, `content-title`) AGAINST ('
badword1 | badword2 | badword3 | "and many more"' IN BOOLEAN MODE)
不幸的是,这个版本忘记了一些单词并且不区分大小写!
接下来的尝试是
$badwords = array("badword1","badword2","badword3","and-many-more");
foreach($badwords AS $name)
{
$sql = "UPDATE `master` SET `blacklisted`='1' WHERE concat(`content-title(mediumtext)`,`content-desc(mediumtext)`) LIKE '%".$name."%'";
sleep(6);
// Could limit this query by 100.000 and adding another foreach loop help?
// How would the foreach look like (select count(*) from master?)/100.000
}
很多查询立即杀死了我的服务器! 也许评论的想法可以帮助?! (但是如何?)
谁有最好的想法如何解决这个问题,而不会过多地强调mysql服务器? 谢谢!
答案 0 :(得分:1)
不确定这将如何在您的表上执行,但您可以进行不区分大小写的比较,作为join子句的一部分。
因此,您有一个要扫描的表(8米行)
CREATE TABLE IF NOT NOT EXISTS haystack
(
word
varchar(10)NOT NULL
)ENGINE = InnoDB DEFAULT CHARSET = utf8;
- 转储表haystack
插入haystack
(word
)值
('猫是'),
('类别'),
('猫'),
( '迪凯特'),
('狗'),
('鸽子'),
('鹰'),
('比格犬'),
('猫'),
( 'CAT');
表格不好
CREATE TABLE IF NOT NOT EXISTS needles
(
bad_word
varchar(10)NOT NULL
)ENGINE = InnoDB DEFAULT CHARSET = utf8;
- 转储表needles
插入needles
(bad_word
)值
('猫'),
( '鹰');
以下查询将以不区分大小写的方式使用模糊匹配来加入两个表。
SELECT * FROM haystack AS h JOIN needle AS n ON h.word COLLATE utf8_general_ci LIKE CONCAT('%',n.bad_word,'%');
您当然可以轻松地对结果进行更新。以下是我得到的结果......如果你不想排除像“Dickson”,“Stitsville”,“Assume”这样的词,那就会变得更加棘手。
word bad_word
一只猫是猫类别猫
猫猫 迪卡特猫 老鹰鹰 比格犬鹰 猫猫猫猫