За последние 24 часа нас посетили 20055 программистов и 1695 роботов. Сейчас ищут 1862 программиста ...

Правильное создание индексов и немного о ключах

Тема в разделе "MySQL", создана пользователем glorsh66, 14 окт 2017.

  1. glorsh66

    glorsh66 Активный пользователь

    С нами с:
    9 июл 2017
    Сообщения:
    247
    Симпатии:
    4
    Я вот не могу совсем полностю понять какие типы индексов нужны в каких случаях.
    как rule of thumb - я понял что индексы выгодны только если будет частный поиски по значениям
    т.к. они замедляют запись в таблицу, но убыстряют поиски

    т.е. лучший пример - это добавления нового пользоваеля (он реже регистрируется, чем заходит на сайт)

    Вот правильно ли я понимаю что юзер должен
    'user_name' => array( //Уникальное нужно для создания индекса
    'type' => 'VARCHAR',
    'constraint' => '100',
    'unique' => TRUE,
    уникальным
    и после чего создать индекс
    "ALTER TABLE `site_users` DROP INDEX `user_name`, ADD UNIQUE INDEX `user_name` (`user_name`);

    Для чего нужны тогда -
    FULLTEXT
    SPATIAL

    Ну т.е. например для поиска по статье?

    И еще я не могу понять зачем нужен KEY (не primary key - это понятно основное поле для индификации записи).
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Ну что сказать.. изучай мануалы MySQL.
    Ключи могут быть не только праймари, но и внешние, чтобы связывать данные в таблицах между собой.

    Заранее бомбить индексы не стоит. Для сборки модели БД можно юзать визуальные среды типа MySQL WorkBench, он сам позаботится о большей части индексов очевидных. А не очевидные надо втыкать только когда начнут появляться записи в логе медленных запросов.

    Вот тут, по ссылке, можно подчерпнуть много полезной инфы.
     
  3. glorsh66

    glorsh66 Активный пользователь

    С нами с:
    9 июл 2017
    Сообщения:
    247
    Симпатии:
    4
    Это я понял - но например foregin key и foregin key constrain это одно тоже?
     
  4. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
  5. ZlobnyKolob

    ZlobnyKolob Активный пользователь

    С нами с:
    25 окт 2016
    Сообщения:
    184
    Симпатии:
    10
    один вопрос,
    Есть таблица статей, где есть id статьи
    далее есть таблица пользователей, где есть id пользователя,
    я создаю таблицу, которая будет содержать сохранение в избранное статьи,
    таблица должна содержать примари кеу или нет?
     
  6. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    я до сих пор как то плаваю в вопросе индексов.. поэтому стараюсь делать несколько простых запросов вместо одного сложного)
     
  7. ZlobnyKolob

    ZlobnyKolob Активный пользователь

    С нами с:
    25 окт 2016
    Сообщения:
    184
    Симпатии:
    10
    Это все к вопросу об автоматизации , у меня в таблице будет несколько тысяч записей и поэтому задаюсь вопросом изначально
    я всегда предпочитаю один большой запрос , чем несколько маленьких :D
     
  8. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    с несколько тысячами записей в базе можно даже особо не заморачиваться над вопросом ускорения) все равно быстро найдет) даже если сильно накосячить)
     
  9. ZlobnyKolob

    ZlobnyKolob Активный пользователь

    С нами с:
    25 окт 2016
    Сообщения:
    184
    Симпатии:
    10
    :)
     
  10. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    Ты только предупреждай, что ты опасный человек, которому нельзя доверять проектирование базы данных.
     
  11. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    в 99 случаях структуры баз простейшие.. что там проектировать то.. а для одного процента - есть супер мега специалисты по БД...
     
  12. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    третья? Обеспечивающая многие-ко-многим связь? В 95% случаев праймари кей там не нужен. А индекс можно строить мультиколоночный, по паре пользователь-статья.
    --- Добавлено ---
    На самом деле нет. Это твоя личная выборка такая на твое счастье :)
     
    ZlobnyKolob нравится это.
  13. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    Ну наверно да)) я как то не встречал что то сложное в архитектуре)) везде все одно и тоже))
     
  14. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    на выборке 100 записей могут начинаться проблемы в сложных запросах. Количество записей в выборке как и количество записей не единственный критерий для скорости выполнения.
     
  15. ZlobnyKolob

    ZlobnyKolob Активный пользователь

    С нами с:
    25 окт 2016
    Сообщения:
    184
    Симпатии:
    10
    я так и думал, спасибо !
     
  16. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    Вопрос который любили задавать в последней команде кандидатам: сколько индексов на запрос может задействовать MySql?
    ну и далее... какой выход?
    А почему может понадобится 2 индекса? Какие кейсы?
    А есть СУБД которые могут?

    Грубо говоря, получается так, что верный ответ на каждый вопрос (в сочетании с опытом применения и возможности разъяснения) это +10-20к размеру чека разработчика :D
    Это к вопросу важности темы.
     
  17. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Вообще, как по мне, сначала проектируем БД и систему, потом курим эксплейны на запросах, где они неочевидны, потом тестим, прицепив тот же Mysqltuner или его аналоги, потом делаем выводы.

    А еще подумай, что этот индекс, по-хорошему, должен быть UNIQUE. Чтобы не удивляться, что у тебя связи плодятся дублирующиеся. Но, опять же, зависит от того, что ты делать собираешься.

    А еще почитай про денормализацию данных. Удивишься, но некоторые вещи проще и правильнее хранить не в таблице многие-ко-многим, или M:N, а, к примеру, в виде того же JSON. И не в отдельной таблице, а как часть одной из родительских. Исходя из способа обращения с данными. Частоты использования.

    А еще подумай о кешировании. Что-то, конечно сам MySQL кеширует, отдавая тебе готовые выборки, вместо проведения реальных, но, если ты берешь какие-то крайне редко изменяемые данные каким-то сложнячим запросом то, мб стоит сохранить результат этого запроса куда-нибудь себе? Да хоть в сессию. Ну, конечно, если это согласуется со здравым смыслом.

    Крч, я к чему веду - серебряной пули нет. Нельзя добиться успеха по инструкции. Нельзя построить годную систему по мануалам. В 95% случаев эти мануалы и гайды - последствия "синдрома выжившего" или "ошибки выжившего". Когнитивного искажения. Изучай документацию к тому, с чем работаешь, делай выводы. Ссылку по индексам и паттернам/антипаттернам выше я уже дал.
     
    glorsh66 нравится это.