1

私のプロジェクトの一部には、データベースに大量の IP を保存および取得することが含まれます。プロジェクトを開始してから数か月以内に、私のデータベースには数百万の IP があると見積もっています。その場合、大きなデータベースへの単純なクエリがどれだけ遅くなるか知りたいですか? 次のクエリのおおよその速度は次のとおりです。

SELECT * FROM table where ip= '$ip' LIMIT 1
INSERT INTO table(ip, xxx, yyy)VALUES('$ip', '$xxx', '$yyy')

2億6500万行のテーブルで?

可能なすべてのipv4 IPアドレスの最初の2つの数字すべてに対応する名前を持つ255 ^ 2テーブルを作成することで、クエリの速度を速めることができますか?各テーブルには、可能なすべての2番目の部分に対応する最大255 ^ 2行がありますに。したがって、たとえば IP アドレス「216.27.61.137」を照会するには、「216.27」(p1) と「61.137」(p2) の 2 つの部分に分割されます。最初に、スクリプトは p1 という名前のテーブルを選択し、次に「p2」という行があるかどうかを確認し、存在する場合はその行から必要なデータを取得します。同じプロセスを使用して、新しい IP をデータベースに挿入します。

上記の計画がうまくいかない場合、大規模なデータベースでクエリを高速化するための良い方法は何ですか?

4

3 に答える 3

1

両方の質問に対する答えは、の使用にかかっていますINDEXES

テーブルが最初のクエリでインデックス付けされipている場合、テーブルのサイズに関係なく、ほぼ即座に実行する必要があります。MySQL はインデックスを使用します。MySQL はそれぞれのインデックスを更新する必要があるため、2 番目のクエリは遅くなりますINSERT

テーブルがインデックス化されていない場合、MySQL はテーブルの最後に行を追加するだけなので、2 番目のクエリはほぼ即座に実行されます。MySQL は毎回テーブル全体をスキャンする必要があるため、最初のクエリは使用できなくなる可能性があります。

問題はバランスです。インデックスを追加すると、最初のクエリは高速化されますが、2 番目のクエリは遅くなります。何が起こるかは、サーバー ハードウェア、選択したデータベース エンジン、MySQL の構成、その時点で他に何が起こっているかによって異なります。パフォーマンスが重要である可能性が高い場合は、最初にいくつかのテストを実行してください。

于 2013-07-11T21:15:28.297 に答える