1

我有一个包含 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 服务器带来太多压力?谢谢!

4

1 回答 1

1

不确定这将如何在您的表上执行,但您可以进行不区分大小写的比较,作为连接子句的一部分。

因此,您有一个要扫描的表(有 8m 行)

如果不存在则创建表haystack( wordvarchar(10) NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- 为表转储数据haystack

插入haystack( word) 值 ('a cat is'), ('category'), ('cat'), ('decatur'), ('dog'), ('pigeon'), ('eagle'), ( 'a beagle'), ('Cat'), ('CAT');

和一张脏话的桌子

如果不存在则创建表needles( bad_wordvarchar(10) NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- 为表转储数据needles

插入needles( bad_word) 值 ('cat'), ('eagle');

以下查询将使用模糊匹配连接两个表,不区分大小写。

SELECT * FROM haystack AS h JOIN needles AS n ON h.word COLLATE utf8_general_ci LIKE CONCAT('%' , n.bad_word , '%');

当然,您可以轻松地对结果进行更新。这是我得到的结果......如果你不想排除像“Dickson”、“Stitsville”、“Assume”这样的词,它会变得更加棘手。

单词 bad_word

猫就是猫

类别猫

猫猫

迪凯特猫

老鹰老鹰

一只小猎鹰

猫猫

猫猫

于 2012-04-05T14:43:47.940 回答