2017-02-24 16 views
-2

iは、行検索エンジン - PHP

の何百万人とMySQLのテーブルを持っており、これは、それは私がこのクエリ

を使用してIA検索エンジンをやりたい情報

id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, 
dob date NOT NULL, 
name VARCHAR(32) NOT NULL, 
age VARCHAR(2) NOT NULL, 
country VARCHAR(25) NOT NULL, 
phone VARCHAR(32) NOT NULL, 
city VARCHAR(32) NOT NULL, 
comment tinytext NOT NULL, 

です

SELECT * FROM dbname 
    WHERE name LIKE '%$var%' 
     AND (age = '$age' 
     AND phone = '$phone' 
     AND country = '$country' 
     AND city = '$city') 

このクエリはパフォーマンスに優れていますか?または私は何を使うべきですか? ..私はテーブルが巨大であると行

の何百万人が含まれており、あまりにも多くのユーザーが、一日あたりの

+1

サーバーでクエリを実行し、完了までに要した時間が要件を満たしているかどうかを確認してください。そうでない場合は、詳細情報を取得するためにEXPLAINクエリを実行してみてください。 – NaeiKinDus

答えて

0

のアドバイスで

おかげで、このクエリを使用する前データベース「」の間の技術的な違いを学ぶしてください言ったようにと 'テーブル'。この議論のほとんどは、「データベース」ではなく「テーブル」に関するものです。 (「データベース」は「表」の集合であり、「表」は行と列のデータを含む)

countryを正規化または略します。 2文字のコードは良いです。次に列を宣言する

country CHAR(2) CHARACTER SET ascii 

age VARCHAR... ?? TINYINT UNSIGNEDを使用すると、はるかに小さくなります。または... dobがあるので、計算してください。

TINYTEXTには微妙な問題があります。同等のVARCHAR(255)を使用してください。

生年月日は機密情報とみなされます。そのようなものを収集して保管すべきかどうかを再考する。

「数百万の行」は「巨大」とはみなされません。しかし、あなたはインデックスが必要です。

LIKE先頭にワイルドカードを使用するとインデックスを使用できないため、nameを扱うフィルタは無視します。

他の4つの列があるAND d - それらのいずれかまたはすべての単一のインデックスが非常に便利です。

phoneは非常に選択的である可能性が高いので、あなたは簡単な

INDEX(phone) 

を持っている可能性があり、そのSELECTは非常に高速に実行します。

テーブルとクエリでは、パーティション分割またはシャーディングの必要はなく、パフォーマンス上の利点もありません。