Ако разбирам въпроса ви, знаете, че MATCH AGAINST използва вашия индекс FULLTEXT и се чудите как MySQL прилага останалата част от клаузата WHERE (т.е. прави ли сканиране на таблици или индексирано търсене).
Ето какво предполагам за вашата таблица:тя има ПЪРВИЧЕН КЛЮЧ в някаква колона с идентификатор и индекс ПЪЛЕН ТЕКСТ.
Така че първо MySQL никога използвайте индекса FULLTEXT за клаузата WHERE за град/щат. Защо? Тъй като индексите FULLTEXT се прилагат само със СЪВПАДАНЕ СРЕЩУ. Вижте тук в абзаца след първия набор от водещи символи (не на съдържанието).
РЕДАКТИРАНЕ: Във вашия случай, ако приемем, че таблицата ви няма само 10 реда, MySQL ще приложи индекса FULLTEXT за вашето СЪВЪВСТАВЯНЕ, след което ще направи сканиране на таблицата на тези резултати, за да приложи града/щата КЪДЕ.
И така, ако добавите BTREE индекс към град и държава?
CREATE INDEX city__state ON table (city(10),state(2)) USING BTREE;
Е, MySQL може да използва само един индекс за тази заявка, тъй като това е прост избор. Ще се сие използвайте ПЪЛЕН ТЕКСТ или BTREE. Обърнете внимание, че когато казвам един индекс, имам предвид една дефиниция на индекс, а не една колона в индекс от няколко части. Впрочем, тогава възниква въпросът кое прави използва ли?
Това зависи от анализа на таблицата. MySQL ще се опита да оцени (въз основа на статистиката на таблицата от последната OPTIMIZE TABLE) кой индекс ще съкрати най-много записи. Ако градът/щатът WHERE ви намали до 10 записа, докато MATCH AGAINST ви свали само до 100, тогава MySQL ще използва индекса city__state първо за града/щата WHERE и след това направете сканиране на таблицата за МАЧ СРЕЩУ.
От друга страна, ако MATCH_AGAINST ви сведе до 10 записа, докато град/щат WHERE ви сведе само до 1000, тогава MySQL ще приложи първо индекса FULLTEXT и ще сканира таблици за град и щат.
Изводът е кардиналността на вашия индекс. По същество колко уникални са стойностите, които ще влязат във вашия индекс? Ако всеки запис във вашата таблица има град, зададен на Оукланд, тогава това не е много уникален ключ и затова има city ='Oakland' всъщност не намалява броя на записите толкова много за вас. В такъв случай казваме, че вашият индекс city__state има ниска кардиналност .
Следователно, ако 90% от думите във вашия ПЪЛЕН ТЕКСТ индекс са „Джон“, тогава и това не ви помага много по същите причини.
Ако можете да си позволите пространството и допълнителните разходи UPDATE/DELETE/INSERT, бих препоръчал да добавите индекса BTREE и да оставите MySQL да реши кой индекс иска да използва. Според моя опит той обикновено се справя много добре с избора на правилния.
Надявам се това да отговори на въпроса ви.
РЕДАКТИРАНЕ: Като странична бележка, уверете се, че сте избрали правилния размер за вашия BTREE индекс (в моя пример избрах първите 10 знака в града). Това очевидно оказва огромно влияние върху кардиналността. Ако сте избрали град (1), тогава очевидно ще получите по-ниска мощност, отколкото ако сте избрали град (10).
РЕДАКТИРАНЕ 2: Планът за заявки (оценка) на MySQL, за който индексът отрязва най-много записи, е това, което виждате в EXPLAIN.