За последние 24 часа нас посетили 26862 программиста и 1512 роботов. Сейчас ищут 847 программистов ...

Составные индексы vs простые

Тема в разделе "MySQL", создана пользователем maxycwebber, 13 июн 2014.

  1. maxycwebber

    maxycwebber Новичок

    С нами с:
    25 мар 2014
    Сообщения:
    263
    Симпатии:
    11
    Адрес:
    Gdansk
    Глупый вопрос.
    есть база cities
    city_id, country_id, region_id, title_ru, title_en ... etc
    записей порядка 2 лямов.

    city_id - понятное дело primary

    и вот тут у меня вопрос. как делать индексы?
    country_id, region_id одним индексом? или на каждое поле отдельные индексы?

    поиск может быть как по обоим полям, так и по 1 из
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Индексы помогают в выборках. Соотв. и формируются так, чтобы быть удобнее для сервера в выборке.
     
  3. maxycwebber

    maxycwebber Новичок

    С нами с:
    25 мар 2014
    Сообщения:
    263
    Симпатии:
    11
    Адрес:
    Gdansk
    я это знаю. я не понимаю различий между отдельными и совместными индексами
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Ну типа если у тебя есть составной индекс уже готовый по тем полям по которым ты выбираешь и сортируешь, то это лучше, чем если у тебя будут несколько отдельных индексов.
     
  5. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    пересекающиеся индексы могут в несколько раз замедлить select (инфа 100% из практики). Так что не делай отдельных индексов на поля, которые включены в составной.
     
  6. maxycwebber

    maxycwebber Новичок

    С нами с:
    25 мар 2014
    Сообщения:
    263
    Симпатии:
    11
    Адрес:
    Gdansk
    так как я в индексах не особо разобрался почему то в своей проф жизни, то я если делал индексы, то на каждое поле, по которому происходила какая либо работа. поиск, группировка, сортировка.
    составные я не делаю никогда
     
  7. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    +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]. Тогда нужно вытащить все запросы, проанализировать заново на необходимость индексов и поменять их в таблицу.
     
  8. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    IMHO, некорректно вообще так ставить вопрос: "Составные индексы vs простые". Твои запросы могут потребовать какой-то конкретный индекс. Он может быть простым или составным. Что надо, то и делаешь.

    Если задача в том, чтобы сократить объем индексов до разумного минимума, то надо смотреть типичные запросы. Хороший запрос отбрасывает бОльшую часть ненужных данных в самом начале, затем по оставшемуся маленькому набору допустим тупой перебор.
    В твоем случае если условие всегда включает в себя и country_id, и region_id, то наверное можно индексировать только по country.

    Если у тебя есть составной индекс (country, region), то запросы по части индекса будут эффективны, если они используют первые (country) сегменты индекса. Если они хотят только правые (region) сегменты, то такой индекс не будет использован.
     
  9. maxycwebber

    maxycwebber Новичок

    С нами с:
    25 мар 2014
    Сообщения:
    263
    Симпатии:
    11
    Адрес:
    Gdansk
    всем спасибо. стало чуть светлее в этой области знаний