質問

私が制御することはできませんその上のプロセスによって移入さは40万件のレコードを含むMySQLのテーブルを持っています。データは毎月一度だけ追加されます。このテーブルには、[名前]列で検索できるようにする必要があります。しかし、名前の欄には、フォーマット「最後最初の中間」で完全な名前が含まれています。

sphinx.confで、私が持っている

sql_query = SELECT Id, OwnersName,
substring_index(substring_index(OwnersName,' ',2),' ',-1) as firstname, 
substring_index(OwnersName,' ',2) as lastname
FROM table1

どのように私はFirstNameおよび/または姓で検索するスフィンクス検索を使うのですか?私は最初の名前に「スミス」を検索できるようにしたいですか?

役に立ちましたか?

解決

他の回答による

判断すると、私が何かを見逃していることがあります...しかし、あなたは拡張(またはの、Extended2)一致モードを使用していることを確認し、特定のフィールドにスフィンクスでの検索を制限し、次のクエリを使用します文字列:@firstname Smith

他のヒント

SQLクエリでは、

ごとの列関数は常に大きくなることがあり、テーブルのための悪い考えです。あなたは列の一部を検索したい場合は、それは自身のコラムに出て抽出してインデックスを作成する必要があります。

(人口・プロセスではなく)スキーマを支配する力を持っている場合、私はOwnersNameから関連情報を抽出し、適切に新しい列をpopulats更新/挿入トリガーと一緒にOwnersFirstNameとOwnersLastNameと呼ばれる新しい列を挿入する、ことをお勧めます。

この行は、いない変更されたときにのみ行われる最初の名前を考え出すの費用を意味し、はあなたのクエリを毎回実行します。それはそれを行うには正しい時間です。

次に、あなたのクエリは疑いの余地なく、高速になります。そして、はい、これは3NFを破るが、ほとんどの人は、それはあなたが結果を理解提供し、パフォーマンス上の理由のためにそれを行うために大丈夫だということに気付いていません。新しい列がトリガーによって制御されているので、懸念の原因となり、データの重複は「クリーン」である。

問題のほとんどの人々が持っているデータベースとそのクエリの速度です。性能向上を大量に獲得するために、ディスク領域のビットを無駄にすることは、通常は大丈夫です。

あなたも、スキーマの上に絶対にの無の力を持っていない場合は、

、別の可能性は「正しい」スキーマを使用して独自のデータベースを作成し、実際のデータベースから定期的にそれを移入することです。そして、あなたを問い合わせます。許可された場合、最初のオプションは、より良いものですので、それはしかし、毎月のデータ転送の公平なビットを含むことができる。

あなたがで検索するフィールドの一部を取得するには、サブストリングを使用することができますが、それはプロセスが遅くなります。それはテーブル内の各レコードに触れることがあるので、クエリには、比較を行うために、インデックスのいずれかの種類を使用することはできません。

最高のは、同じフィールドに複数の値を格納しますが、3つの別々のフィールドに名前コンポーネントを置くことではないだろう。あなたがフィールドに複数の値を格納すると、それはほとんど常にデータにアクセスするいくつかの問題です。私は別のフォーラムで、この何度も見...

このfulll名等接頭辞、接尾辞、ミドルネームなしミドルネーム、複合姓と名を持つとハイフンなしを、含まれていることができ難治problrmであるため、100%の信頼性

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top