質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

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

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

3回答

581閲覧

MySQL あいまい検索について

aiko_1122

総合スコア24

MySQL

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

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2019/11/15 07:29

やりたいこと

インポートするデータがすでにデータベースに格納されているデータと重複していないかチェックしたい

実装方法

$text_tmp = mb_substr($text, 0, 40); $article_text_count = $this->Article->find() ->where(['text like "%'.$text_tmp.'%"'])->count();

発生している課題

すでにデータが30万件ほど格納されているため、インポートするデータをひとつひとつチェックすると
サーバーへの負荷がすごいことになる。

・Like以外で良い方法がないか
・PHPで行った方がよいか

等あればご教授願いたいです。

追加情報

▼ バージョン
php 7.0
mysql 5.7
cakephp 3.4

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

  1. ワークテーブルを用意して、そこに全てのデータを取り込む。

  2. INSERT ... SELECT ... FROM ワークテーブル WHERE で副問合せ を使ってターゲットのテーブルに存在しないデータのみを対象にする。

投稿2019/11/15 07:48

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dameo

2019/11/15 08:19

どうせインポートするならこの方式が一番いいと思います。 事前の確認も出来るし、ロールバックも出来るし、総合的な負荷が一番小さいと思う。
guest

0

あいまい検索ではじくのは現実的ではないでしょう。
完全一致ならユニーク属性つけてしまうだけです

投稿2019/11/15 07:40

yambejp

総合スコア114814

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aiko_1122

2019/11/15 07:43

ありがとうございます! データとしては被る場合があっても良いため、ユニークではダメなんです... なのであくまであいまい検索を行いたいです。
yambejp

2019/11/15 07:45 編集

> データとしては被る場合があっても良いため、ユニークではダメなんです. おなじデータは登録できてあいまいだとはじくという状況がわかりません 具体的な登録できるできないのサンプルをお願いします
aiko_1122

2019/11/15 07:48

あいまいで検索した結果、重複していると判断された場合は「重複」というフラグを立ててデータを格納します。 完全一致だろうがあいまいだろうがデータは必ず登録します。 そのため、あいまい検索をする必要があるということです。 わかりづらく大変申し訳ありません。
yambejp

2019/11/15 07:57

前方一致、後方一致のどちらかのあいまい検索までが限界で 一部一致のあいまい検索をするかぎり絶対に効率的な処理は無理です (インデックスが効きません) あとはしつこいようですが、サンプルがないといつまでたって噛み合わないと思います
yambejp

2019/11/15 08:11 編集

考え方:abcというデータがすでにあるとき、 (1)bというデータを入れようとすると「曖昧重複」する (2)xabcyというデータを投入は問題なくできる しかしxabcyに対してabcは曖昧類似状態 ※入力時にあいまいを弾いても、フラグ処理に無関係で曖昧データは発生する
guest

0

LIKEと仰っているので部分一致を検知したい場合は駄目ですが、DBのカラムにUnique制約つけてしまうのが早いです。
文字列長さが長い場合は重複チェックしたいカラムのhash値を持つカラムを用意して、そちらにUnique制約をつけてしまうのもありです。
いずれにせよ論理削除している場合使えないですが。

投稿2019/11/15 07:38

wuzzy

総合スコア152

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aiko_1122

2019/11/15 07:43

ありがとうございます! データとしては被る場合があっても良いため、ユニークではダメなんです... なのであくまであいまい検索を行いたいです。
wuzzy

2019/11/15 07:52

なんとなく別の回答からやりたいこと理解しました。 取り敢えず登録してしまってよいのであれば、登録時に曖昧チェックするのではなく、登録後に類似データがある場合にフラグを立てるようなバッチを走らせてはどうでしょうか? PHPとMySQLに頼らずいろんな選択肢が出てくると思います。
aiko_1122

2019/11/15 07:58

ありがとうございます。 わかりづらく大変申し訳ありません。 確かにバッチ処理であれば対応できそうです。 一度そちらで試してみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問