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

これがテーブルでどのように実行されるかはわかりませんが、join句の一部として、大文字と小文字を区別しない比較を行うことができます。

つまり、スキャンしたいテーブルがあります(8m行)

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

-テーブルのデータをダンプしますhaystack

INSERT INTO haystackword)VALUES('a cat is')、('category')、('cat')、('decatur')、('dog')、('pigeon')、('eagle')、( 'ビーグル')、('猫')、('猫');

そして悪い言葉のテーブル

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

-テーブルのデータをダンプしますneedles

INSERT INTO needlesbad_word)VALUES('cat')、('eagle');

次のクエリは、あい​​まい一致を使用して、大文字と小文字を区別せずに2つのテーブルを結合します。

SELECT * FROM haystack AShJOIN針ASnON h.word COLLATE utf8_general_ci LIKE CONCAT('%'、n.bad_word、'%');

もちろん、結果の更新は簡単に実行できます。これが私が得た結果です...「Dickson」、「Stitsville」、「Assume」などの単語を除外したくない場合は、はるかにトリッキーになります。

単語bad_word

猫は猫です

カテゴリ猫

猫猫

ディケーター猫

イーグルイーグル

ビーグルイーグル

猫猫

CAT猫

于 2012-04-05T14:43:47.940 に答える