'立派なに向かっている間 '、200万行は、テーブルとしてはまだ比較的小さいサイズです。 (したがって、通常、より高速なパフォーマンスが可能です)
ご存知のとおり、フロントエンドのワイルドカードは特に非効率的であり、そのユースケースがアプリケーションで一般的である場合は、この解決策を見つける必要があります。
適切なインデックスのセットがない可能性があります 。ただし、先に進む前に、インデックスは通常、すべての種類のSELECTステートメントでDBMSのパフォーマンスを向上させますが、「CUD」操作(つまり、SQL CREATE / INSERT、UPDATE)のパフォーマンスに体系的に悪影響を与えることを強調したいと思います。 、DELETE動詞、つまり書き込むクエリ 単に読むのではなく、データベースに それに)。場合によっては、「書き込み」クエリに対するインデックスの悪影響が非常に大きくなる可能性があります。
インデックスのあいまいな性質を特に強調する理由は、アプリケーションがその操作の通常の部分としてかなりの量のデータ収集を行っているように見えるためです。INSERTクエリの速度が低下するため、劣化の可能性に注意する必要があります。 。考えられる代替策は、インデックスがないか非常に少ない比較的小さなテーブル/データベースにデータ収集を実行し、この入力データベースから実際のデータマイニングが行われるデータベースにデータを定期的にインポートすることです。 (インポート後、行は「入力データベース」から削除され、INSERT関数のために小さく高速に保たれます。)
もう1つの懸念事項/質問は、キャストテーブルの行の幅(列の数とこれらの列の幅の合計)に関するものです。パフォーマンスの低下は、行が広すぎてテーブルのリーフノードの行が少なすぎて、必要以上に深いツリー構造になるという事実に関連している可能性があります。
インデックスに戻る...
質問のいくつかのクエリを考慮すると、ip + noteインデックス(少なくともこれらの2つのキーをこの順序で作成したインデックス)の恩恵を受けることができるようです。インデックスの状況を完全に分析し、率直に言って、データベーススキーマのレビューをここで行うことはできません(1つに十分な情報がありません...)が、そうするための一般的なプロセスは、最も一般的なユースケースのリストを作成することです。これらのケースでどのデータベースインデックスが役立つかを確認します。 mySQLコマンドEXPLAINを使用すると、特定のクエリが最初に、またはインデックスが追加された後にどのように処理されるかについての洞察を集めることができます。
正規化または非正規化(または実際には両方の組み合わせ!)は、多くの場合、マイニング操作中のパフォーマンスを向上させるための実行可能なアイデアです。