最好的查询来更新一个坏的单词列表的大型mysql数据库(行)

时间:2012-04-05 14:10:35

标签: mysql sql performance

我有一个包含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服务器? 谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

CREATE TABLE IF NOT NOT EXISTS haystack(   word varchar(10)NOT NULL )ENGINE = InnoDB DEFAULT CHARSET = utf8;

- 转储表haystack

的数据

插入haystackword)值 ('猫是'), ('类别'), ('猫'), ( '迪凯特'), ('狗'), ('鸽子'), ('鹰'), ('比格犬'), ('猫'), ( 'CAT');

表格不好

CREATE TABLE IF NOT NOT EXISTS needles(   bad_word varchar(10)NOT NULL )ENGINE = InnoDB DEFAULT CHARSET = utf8;

- 转储表needles

的数据

插入needlesbad_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

一只猫是猫

类别猫

猫猫

迪卡特猫

老鹰鹰

比格犬鹰

猫猫

猫猫