Глупый вопрос. есть база cities city_id, country_id, region_id, title_ru, title_en ... etc записей порядка 2 лямов. city_id - понятное дело primary и вот тут у меня вопрос. как делать индексы? country_id, region_id одним индексом? или на каждое поле отдельные индексы? поиск может быть как по обоим полям, так и по 1 из
Ну типа если у тебя есть составной индекс уже готовый по тем полям по которым ты выбираешь и сортируешь, то это лучше, чем если у тебя будут несколько отдельных индексов.
пересекающиеся индексы могут в несколько раз замедлить select (инфа 100% из практики). Так что не делай отдельных индексов на поля, которые включены в составной.
так как я в индексах не особо разобрался почему то в своей проф жизни, то я если делал индексы, то на каждое поле, по которому происходила какая либо работа. поиск, группировка, сортировка. составные я не делаю никогда
+1 Индексы лучше расставлять в два этапа: 1) При проектировании. Нужно оценить, какие данные, какое их количество будет храниться и как они будут выбираться. К примеру, ты знаешь, что в таблице id | category | sub_category | name 100 категорий и у каждой максимум по 3 субкатегории. Если все запросы имеют в WHERE category & sub_category, то очевидно, что можно сделать составной индекс. Это улучшит производительность. Но и увеличит размер индекса. Если есть запросы без sub_category в WHERE, то лучше сделать индекс только на поле category. В конкретно этом случае индекс на поле sub_category можно не ставить, т.к. после фильтрации по category остается выбор максимум из 3х полей. 2) После написания кода. Бывает так, что после написания кода ты понимаешь, что запросы имеют другие требования к бд. К примеру, вместо category & sub_category идет поиск по name. Еще бывает так, что обнаруживаешь, что запрос работает медленнее, чем ожидалось, несмотря на индексы. Этот случай описал выше [vs]. Тогда нужно вытащить все запросы, проанализировать заново на необходимость индексов и поменять их в таблицу.
IMHO, некорректно вообще так ставить вопрос: "Составные индексы vs простые". Твои запросы могут потребовать какой-то конкретный индекс. Он может быть простым или составным. Что надо, то и делаешь. Если задача в том, чтобы сократить объем индексов до разумного минимума, то надо смотреть типичные запросы. Хороший запрос отбрасывает бОльшую часть ненужных данных в самом начале, затем по оставшемуся маленькому набору допустим тупой перебор. В твоем случае если условие всегда включает в себя и country_id, и region_id, то наверное можно индексировать только по country. Если у тебя есть составной индекс (country, region), то запросы по части индекса будут эффективны, если они используют первые (country) сегменты индекса. Если они хотят только правые (region) сегменты, то такой индекс не будет использован.