1

大量のデータのテーブルがあります。これは、100万の電話番号の1つの列にすぎません。

アップロードされた番号のファイルを受け取るPHPスクリプトに取り組んでいます。データベースに対して各番号を実行して、番号がすでに存在するかどうかを確認したいと思います。存在する場合は、trueが返されるだけで、他のデータは必要ありません。

私は2つの主な質問があります:

  1. パフォーマンス/速度の考慮事項については、次の場合に違いがありますか?
    • 列は2つに分割されました(市外局番のある列A、残りの数字のある列B)。そうすれば、WHEREを使用してクエリを実行し、特定の番号に一致する市外局番を見つけて、残りの7桁を一致させることができますか?
    • それとも、10桁全体を一致させるよりも違いはありませんか?
  2. この質問に対する答え、MySQLテーブルに行が存在するかどうかをテストする最良の方法は次のとおりです。

    SELECT EXISTS(SELECT 1 FROM table1 WHERE ...)
    

    私が間違っていなければ、あなたが探しているものが存在するなら、それは単に値「1」を返すでしょう、正しいですか?PHPで結果を受け取るので、これが最も効率的な方法でしょうか?

4

5 に答える 5

3

数値が小さい場合(そして常に小さい場合)、INを使用するだけで問題ありません。

数値が潜在的に大きい場合は、それらを一時テーブルにロードし、その一時テーブルと既存のテーブルの間でJOINを実行します。内部結合を使用すると、一致するレコードのみが返され、数値とtrueを返すだけで簡単になります。

あなたが何千もの数を扱っているなら、それから:-

一時テーブルを作成します(おそらく番号を一意のキーとして使用します)。一時テーブルに番号をロードします。既存のテーブルに対して一時テーブルを結合します:-

SELECT a.phoneNumber
FROM ExistingNumbers a
INNER JOIN SomeTempTable b
ON a.phoneNumber = b.phoneNumber

これにより、テーブルにすでに存在するすべての番号のリストが表示されます。

テーブルにまだ存在していないすべての番号のリストが必要な場合(おそらく、さらに処理した後でそれらを追加したい場合):-

SELECT b.phoneNumber
FROM SomeTempTable b
LEFT OUTER JOIN ExistingNumbers a
ON a.phoneNumber = b.phoneNumber
WHERE a.phoneNumber IS NULL 
于 2013-03-22T09:29:16.470 に答える
2

パフォーマンス上の理由から、1つのクエリですべての数値を選択します。

SELECT `numbers` FROM `phone_numbers` WHERE `number` IN('123', '456', '789')

次に、結果を繰り返し処理して、数値が含まれているかどうかを確認できます。数値が含まれていない場合は、挿入クエリに追加します。したがって、クエリは2つだけです。1つは選択用、もう1つは挿入用です。

あなたのパフォーマンスの質問に。あなたは電話番号を保存するあなたのフィールドにインデックスを持っているべきです。

于 2013-03-22T09:18:11.673 に答える
1

もう1つ追加したかったのですが、IN句に大きなエントリが含まれていると、インデックスは機能しません。いくつかのエントリがなくなると、テーブル全体が通常の方法でスキャンされ、「numbers」のインデックスは無視されます。

上記の理由から、一時テーブルと内部結合を使用する@Kickstartソリューションをお勧めします。

于 2013-05-01T19:09:01.713 に答える
0

私はそれをしたい

SELECT COUNT(1) FROM table WHERE condition LIMIT 1
于 2013-03-22T09:22:44.313 に答える
0

これは通常、検索されたデータがテーブルに格納されているかどうかを確認する方法です

<?php
function checkifexist($value){
$link = mysql_connect("localhost", "root", "password");
mysql_select_db("database", $link);    

$result = mysql_query("SELECT column FROM table where column='".$value."' ", $link);
$num_rows = mysql_num_rows($result);

if($num_rows > 0)
{
return true;
}
else
{
return false;
}
}
?>

そしてこれ

<?php 
$input = 'test';
if(checkifexist($input))
{
// the script returned true, now do something
}
?>

結果の数を数え、条件付きステートメントを作成するだけです

于 2013-03-22T09:40:51.683 に答える