質問編集履歴

2

退会済みユーザー

退会済みユーザー

2015/08/27 16:31  投稿

MySQLで大量のデータに対して大量のキーワードでフィルタリングする方法
MySQLで商品を扱うようなテーブルがあります。
```SQL
CREATE TABLE tb_items
(
 ID int NOT NULL,
 Name varchar(256),
 Brand varchar(32),
 Category varchar(32),
 Status smallint,
 Status boolean,
 PRIMARY KEY(ID),
 INDEX(Name, Brand, Category)
)
```
上記カラムの意味は順に、「商品ID, 商品名, 製造元, カテゴリ, ステータス」となります。
このテーブルにはデータが数百万件入っているとします。
もう一つ、上記テーブルをキーワードでフィルタリングするためのキーワード用テーブルがあります。
```SQL
CREATE TABLE tb_filter_keyword
(
 ID int NOT NULL auto_increment,
 Keyword varchar(24),
 Type varchar(8),
 PRIMARY KEY(ID),
 INDEX(Keyword)
)
```
上記カラムの意味は順に「キーワード, フィルターを掛けるカラム名」となります。
「フィルターを掛けるカラム名」とは、tb_itemsのどのカラムに対してフィルタリングするかという意味で、値は「Name, Brand, Category」が入ります。
そしてこのテーブルにはキーワードが1万件入っているとします。
* * * * * * * * * * * * * * * * * * * * * * 
ここから質問なのですが、数百万件あるtb_itemsの全行に対して、tb_filter_keywordのキーワードがName, Brand, Categoryのいずれかに含まれる場合、その行のStatusを1に、含まない場合は0にしたいです。
このようなクエリーはfor文で回してLIKE %keyword%で検索し、一つずつ更新していくしかないのでしょうか?
それとももっと効率の良い方法などがあるのでしょうか?
テンポラリーテーブルを作ったり、抽出した新たなテーブルを作ったり、など効率が良ければどのような方法でも構いません。商品数が数百万件、キーワードが1万件ありますので効率の良い方法をお聞きしたいです。
どうぞよろしくお願い致します。
  • MySQL

    11291 questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

1

退会済みユーザー

退会済みユーザー

2015/08/27 16:29  投稿

MySQLで大量のデータに対して大量のキーワードでフィルタリングする方法
MySQLで商品を扱うようなテーブルがあります。
```SQL
CREATE TABLE tb_items
(
 ID int,
 ID int NOT NULL,
 Name varchar(256),
 Brand varchar(32),
 Category varchar(32),
 Status smallint
 Status smallint,
 PRIMARY KEY(ID),
 INDEX(Name, Brand, Category)
)
```
上記カラムの意味は順に、「商品ID, 商品名, 製造元, カテゴリ, ステータス」となります。
このテーブルにはデータが数百万件入っているとします。
もう一つ、上記テーブルをキーワードでフィルタリングするためのキーワード用テーブルがあります。
```SQL
CREATE TABLE tb_filter_keyword
(
 ID int NOT NULL auto_increment,  
 Keyword varchar(24),
 Type varchar(8)
 Type varchar(8),
 PRIMARY KEY(ID),
 INDEX(Keyword)
)
```
上記カラムの意味は順に「キーワード, フィルターを掛けるカラム名」となります。
「フィルターを掛けるカラム名」とは、tb_itemsのどのカラムに対してフィルタリングするかという意味で、値は「Name, Brand, Category」が入ります。
そしてこのテーブルにはキーワードが1万件入っているとします。
* * * * * * * * * * * * * * * * * * * * * * 
ここから質問なのですが、数百万件あるtb_itemsの全行に対して、tb_filter_keywordのキーワードがName, Brand, Categoryのいずれかに含まれる場合、その行のStatusを1に、含まない場合は0にしたいです。
このようなクエリーはfor文で回してLIKE %keyword%で検索し、一つずつ更新していくしかないのでしょうか?
それとももっと効率の良い方法などがあるのでしょうか?
テンポラリーテーブルを作ったり、抽出した新たなテーブルを作ったり、など効率が良ければどのような方法でも構いません。商品数が数百万件、キーワードが1万件ありますので効率の良い方法をお聞きしたいです。
どうぞよろしくお願い致します。
  • MySQL

    11291 questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る