あなたの質問が理解できれば、MATCH AGAINST が FULLTEXT インデックスを使用し、MySQL が残りの WHERE 句をどのように適用するのか (つまり、テーブルスキャンまたはインデックス付きルックアップを行うのか) を知りたいと思います。
あなたのテーブルについて私が想定していることは次のとおりです。いくつかの id 列に PRIMARY KEY と FULLTEXT インデックスがあります。
最初に、MySQL は都市/州の WHERE 句に FULLTEXT インデックスを使用しません。なんで?FULLTEXT インデックスは MATCH AGAINST でのみ適用されるためです。箇条書きの最初のセットの後の段落のhereを参照してください(目次の箇条書きではありません)。
編集:あなたの場合、テーブルに10行ほどしかないと仮定すると、MySQLはMATCH AGAINSTにFULLTEXTインデックスを適用し、それらの結果に対してtablescanを実行して都市/州のWHEREを適用します。
では、都市と州に BTREE インデックスを追加するとどうなるでしょうか。
CREATE INDEX city__state ON table (city(10),state(2)) USING BTREE;
これは単純な選択であるため、MySQL はこのクエリに1 つのインデックスしか使用できません。FULLTEXTまたはBTREEを使用します。1 つのインデックスと言うときは、マルチパート インデックスの 1 つの列ではなく、1 つのインデックス定義を意味することに注意してください。Anwway、これは次に、どちらを使用するのかという疑問を投げかけます。
それはテーブル分析に依存します。MySQL は、(最後の OPTIMIZE TABLE からのテーブル統計に基づいて) どのインデックスが最も多くのレコードを削除するかを推定しようとします。市/州の WHERE ではレコードが 10 まで減り、MATCH AGAINST では 100 までしか減らない場合、MySQL は市/州の WHERE に対して最初にcity__state インデックスを使用し、次に MATCH AGAINST に対して tablescan を実行します。
一方、MATCH_AGAINST によってレコードが 10 に減少し、都市/州の WHERE によって 1000 に減少した場合、MySQL は最初に FULLTEXT インデックスを適用し、都市と州のテーブルスキャンを適用します。
肝心なのは、インデックスのカーディナリティです。基本的に、インデックスに追加される値はどの程度固有のものですか? テーブル内のすべてのレコードの city が Oakland に設定されている場合、それはあまり一意のキーではないため、city = 'Oakland'を指定してもレコード数はそれほど減りません。その場合、city__state インデックスのカーディナリティが低いと言います。
したがって、FULLTEXT インデックスの単語の 90% が「John」である場合、まったく同じ理由であまり役に立ちません。
スペースと UPDATE/DELETE/INSERT のオーバーヘッドに余裕がある場合は、BTREE インデックスを追加し、使用するインデックスを MySQL に決定させることをお勧めします。私の経験では、彼は通常、正しいものを選ぶという非常に良い仕事をしています.
それがあなたの質問に答えることを願っています。
編集:補足として、BTREE インデックスに適切なサイズを選択していることを確認してください (私の例では、city の最初の 10 文字を選択しました)。これは明らかにカーディナリティに大きな影響を与えます。city(1) を選択した場合、明らかに、city(10) を選択した場合よりもカーディナリティが低くなります。
EDIT2:インデックスが最も多くのレコードをプルーニングする MySQL のクエリ プラン (推定) は、EXPLAIN に表示されるものです。