Когда стоит создавать индекс?

Поділитися
Вставка
  • Опубліковано 28 лис 2024
  • Многие слышали про индексы в базах данных, но обсуждение по поводу когда стоит создавать эти индексы встречается в просторах интернета не так уж и часто.
    Этот урок как раз об этом.

КОМЕНТАРІ • 105

  • @olegtotsamiy6588
    @olegtotsamiy6588 2 роки тому +9

    Владимир, спасибо вам огромное, за то, что дарите свет знаний нам, тёмным. Мне 40, переквалифицировался в программисты и учусь по вашим видео!

  • @game_organisation
    @game_organisation 7 років тому +19

    Мужииииииик, ты вообще крут, большой большой большой респект тебе, где ты раньше был, я ещё раз и гораздо лучше все это понял ))))) Ждём твоих видео ))))))

  • @vladbushuev
    @vladbushuev 2 роки тому +3

    Смотрел эти Мини-лекции ещё когда учился в школе, вот уже два года как выпустился из университета. В универе благодаря Владимиру экономил своё время перед экзаменами. Теперь работаю и иногда освежаю информацию в памяти.
    Спасибо вам!

  • @faxtel7771
    @faxtel7771 Рік тому +2

    Даже спустя столько времени актуально, спасибо! Хорошо объяснили, буду иметь ввиду и проверю все ваши советы

  • @polmaksim
    @polmaksim 4 роки тому

    Пожалуй лучшее видео о том, как и когда лучше использовать индексы. Благодарю!

  • @Антон-щ1л7с
    @Антон-щ1л7с Рік тому

    Спасибо Владимир!

  • @googleadmin4749
    @googleadmin4749 Рік тому

    Спасибо, уложил мне и другим все в голове, от вас бы еще сравнение разных баз данных для разных задач )

  • @davidos533
    @davidos533 2 роки тому

    Спасибо, за достоверную информацию, всегда бьете прямо в цель и суть вопроса!

  • @game_organisation
    @game_organisation 7 років тому +14

    Расскажи пожалуйста про составные индексы и про очерёдность столбцов, хотелось бы ещё видеть как писать код

  • @артёмтема-с3ъ
    @артёмтема-с3ъ 4 роки тому

    супер видео! благодарю, кратко понятно. вопросы задают на собеседование. Я так понял, надо все запросы из программы собрать, после проанализировать какие поля в where используются и создать по ним индекс.

  • @okaylooker
    @okaylooker 5 років тому +4

    Большое спасибо за подробное разъяснение, а то я сам чуть все индексами не сделал ;)

  • @AS-fk5fw
    @AS-fk5fw 2 роки тому

    Это супер! Очень помогли при архитектуре БД и составлении схем в ORM, спасибо!

  • @Алексей-о9б4г
    @Алексей-о9б4г 9 років тому +9

    Спасибо! Хорошо объяснили. Будут ли видео о проектировании баз данных? Какие-то рекомендации на эту тему? Нормализации таблиц, денормализации, ведь это тоже с производительностью тесно свзяано, например много JOIN'ов не есть хорошо и.т.д.

  • @stMrJerry
    @stMrJerry 8 років тому +5

    При update/insert ты едва ли что-то теряешь при использовании индекса. Потеря константна.
    А вот при select ты очень много экономишь при использовании индекса. Экономия зависит от величины базы.
    И ради солнца, ставьте индексы на внешний ключ, всегда)
    История из жизни: выполнялась по cron'у раз в минуту одна процедура. Ну секунд 20-30 занимала, вроде норм. Шли месяца... Данных становилось все больше, и больше. Стало так много, что эта процедура стала занимать больше минуты. В итоге процессы не успевали закончитьься, как появлялись такие же новые. Больше процессов, меньше ресурсов - еще медленнее процедуры - еще больше процедур. Ну вы наверное уже поняли к чему я клоню. Сервер упал)))
    Сервер пролежал 7 часов! Пока все опомнились, пока сообщили нужным людям, а те другим людям, а те программистам, пока программист подключился, перезагрузил сервер, все поднял, обнаружил проблему, поправил... Так что не ленитесь ставить индексы!)
    Для сравнения, после добавления одного единственного индекса процедура стала занимать ~8 секунд! А там записей было не так много, немногим больше миллиона.

    • @keydon5661
      @keydon5661 5 років тому

      Jerry Green так ваша история не про индексы, а про то что надо использовать flock, если команду стоит запускать в одном экземпляре

  • @alex.mon1989
    @alex.mon1989 Рік тому

    Супер!
    Чуть подробнее интересно было бы услышать про WHERE с операторами сравнения "больше" и "меньше".

  • @qqryzka4736
    @qqryzka4736 4 роки тому

    Ничего нового не узнал, имею богатый опыт, но хочу отметить очень качественную, доходчивую и лёгкую к восприятию подачу материала.

  • @andyanderson222
    @andyanderson222 3 роки тому

    Супер! Всё очень доходчиво, большое Вам спасибо!

  • @alexeymalashenko8861
    @alexeymalashenko8861 6 років тому +1

    Молодец! Спасибо, за материал.

  • @StepanVorobiov
    @StepanVorobiov Рік тому

    Отличное видео! Спасибо

  • @andrew_b2r
    @andrew_b2r 7 років тому +1

    Володя спасибо! Хорошо рассказываешь. Расскажи какие типы индексов использовать в каких случаях.

  • @aidamur
    @aidamur Рік тому

    Коротко и по делу. Очень годно.

  • @TheBenderbej
    @TheBenderbej 4 роки тому

    огромная спасибо! отличное объяснение! долго в голове не укладывалось

  • @НикитаШевченко-д9ц

    Что поменялось спустя 5 лет? Советы индексирования остались те же? Или есть какие-то изменения?

  • @mamikonvartapetyan3189
    @mamikonvartapetyan3189 4 роки тому +2

    Автор, немного серьезнее отнестись к тому, что говорите. Вы делаете акцент на том, что Having выполняется после в конце, но это не аргумент, т.к. Order by выполняется вообще последним, после Select, перед которым выполняется Having.
    И то что "для select нужно сдавать индексы, а для update нет" - это конечно тоже странное утверждение, учитывая что update - в используемом контексте это и select также, со своими возможными предикатами, для которых тоже используется индекс.

  • @TEFTEJIb
    @TEFTEJIb 3 роки тому

    Спасибо очень наглядно, подскажи пожалуйста если делать инсерт новых строк то индекс на них индекс автоматом встанет? И ещё вопрос апдейт быстрее чем перезапись всей таблицы (более 10млн строк) ?

  • @testweb5425
    @testweb5425 5 років тому

    Спасибо! Вы очень хорошо объясняете!

  • @kelevra1493
    @kelevra1493 3 роки тому

    Спасибо дядька! Полезно.

  • @cosmo_polit
    @cosmo_polit 2 роки тому

    спасибо за полезную информацию

  • @alukardishe
    @alukardishe 9 років тому +1

    Отлично все объяснил! Спасибо)

  • @wamikgildiev6632
    @wamikgildiev6632 Рік тому

    Вопрос: а если колонка часто используется в секции WHERE, но при этом так же часто подвергается UPDATE'у?

  • @IPmen10001
    @IPmen10001 Рік тому

    Подскаэите пжлста есть ли смысл создавать индекс для таблицы где всего две колонки форен кей

  • @Adapt-wj5gi
    @Adapt-wj5gi 6 років тому +1

    Отлично спасибо ! Частные уроки по скайпу проводите ?

  • @ВиталийЧернецкий-к9о

    Добрый день!
    Команда CREATE MATERIALIZED VIEW AS SELECT вставляя данные в мат. витрину под капотом использует INSERT.? По сути она вставляет данные., значит это INSERT?

  • @Ничтожество-и5ш
    @Ничтожество-и5ш 4 роки тому

    Спасибо за лекцию. Очень помогли

  • @artyomkorbut5623
    @artyomkorbut5623 4 роки тому

    Отличное видео! Большое спасибо

  • @Nodorgrom
    @Nodorgrom Рік тому

    Как общая теория пойдет, вы знаете, что бывают различные алгоритмы индексов, каждый под свою задачу. Так что важно было упомянуть с какими данными приходится работать

  • @IndexRTS
    @IndexRTS 3 роки тому

    Объясните пожалуйста, для чего нужны связи, отношения. Не совсем пойму логическое для чено они нужны. Весь интернет заполнен этими связями а вот для чего они нужны не совсем понятно, никто не объясняет. Объясните пожалуйста

  • @VaeV1ct1s
    @VaeV1ct1s Рік тому

    Зачем вы учите тому, в чём не разбираетесь? К примеру в постгрес, запросы where > < >=

  • @Nikki713100
    @Nikki713100 2 роки тому

    урок пушка, спасибо!

  • @gpankov
    @gpankov Рік тому

    а если в ON есть операция >?

  • @cruisecontrol1489
    @cruisecontrol1489 2 роки тому

    почему сравнение больше/меньше менее эффективно чем равенство?

  • @bitcampru
    @bitcampru 3 роки тому

    Володя спасибо, я все понял понял)

  • @sergeymain4205
    @sergeymain4205 7 років тому

    Мне пока кажется, что для Join on в первую очередь нужно делать индекс. приоритетнее чем where.

  • @gpankov
    @gpankov Рік тому

    Лучший!

  • @eney1975
    @eney1975 5 років тому

    спасибо, давно искал такое простое объяснение

  • @romanyuzhanin3541
    @romanyuzhanin3541 7 років тому +2

    а если я ищу не через оператор = ,а через оператор IN и поиск у меня происходит по нескольким полям IN(поле1, поле2)?

    • @tanataytkaliyev5206
      @tanataytkaliyev5206 3 роки тому

      А аналогом чего в sql является in? Ответив на этот вопрос, получите ответ на изначальный

  • @АлексейОнуфриенко-у4п

    Спасибо !!! Поставил индексы и скрипт стал выполнятся не 750 сек, а 10 сек )

    • @chuckchuck1090
      @chuckchuck1090 4 роки тому

      @unk unk ну мб там база на 60млн записей))) У меня на работе есть и больше

  • @KostiantynNosach
    @KostiantynNosach 5 років тому

    Спасибо, очень информативно

  • @Moonsters100
    @Moonsters100 9 років тому +1

    Здравствуйте! Не знал, что индексы так же помогают в сортировке данных.. Скажите вот у меня в таблице есть поле, которое принимает id родительского комментария и соответственно может повторятся, и тут возник вопрос стоит ли его индексировать? просто всегда думал, что индекс должен быть уникальным. Спасибо.

    • @VladimirMozhenkov
      @VladimirMozhenkov  9 років тому +2

      +Moon- -Ster Вы-же будете его использовать для JOIN-ов, так что скорее всего стоит.

    • @VladimirMozhenkov
      @VladimirMozhenkov  9 років тому +1

      +Moon- -Ster Уникальность не обязательна ))

  • @forcemeat9726
    @forcemeat9726 Рік тому

    если update с блоком where, то индекс будет задействован и тоже поможет)

  • @klerg321
    @klerg321 Рік тому

    ээээ... это сколько кже лет посгри индексирует и лайк, и сравнения в зависимости от индекса?? (b tree)

  • @ВладВлад-ж6к
    @ВладВлад-ж6к 3 роки тому

    Комментарий для продвижения видео

  • @ЕрвандАгаджанян-в3к

    Гений!

  • @shmulful
    @shmulful 9 років тому +1

    Спасибо!

  • @blusterhash
    @blusterhash 9 років тому +1

    Вроды бы для запросов с like вида "%something", "something%" и "%something%" index будет полезен

    • @VladimirMozhenkov
      @VladimirMozhenkov  9 років тому

      +Абакумов Андрей Здесь уже, на сколько я знаю, зависит от конкретной базы данных. Многие и такое могут оптимизировать. Например они могут использовать бинарные (или другие) деревья для ускорения поиска... и тд. Но вот например если вы уже используете регулярное выражение, тут я не знаю баз данных которые вам помогут.

  • @gtbutcher379
    @gtbutcher379 4 роки тому

    Володя я тебя люблю

  • @SuperArtgun
    @SuperArtgun 7 років тому +1

    Мужик !

  • @kanakana7095
    @kanakana7095 5 років тому

    Здравствуйте!Вопрос такой , у меня поле при инсерте записи изначально null но потом апдейтится только один раз. Данное поле участвует в join.Стоит его индексировать ?

    • @dmitriist255
      @dmitriist255 4 роки тому

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

  • @KlenKlenov
    @KlenKlenov 3 роки тому

    Спасибо.

  • @arahnid_9844
    @arahnid_9844 2 роки тому

    👍

  • @SUBSCRIBERSWITHOUTVIDEO-eu3ir
    @SUBSCRIBERSWITHOUTVIDEO-eu3ir 9 років тому

    Добрый день , можно узнать почему на этом видео стд лицензия ?

    • @VladimirMozhenkov
      @VladimirMozhenkov  9 років тому

      +Иван Иванович Исправил. Если заметите такое ещё, дайте знать.

  • @php-b30
    @php-b30 4 роки тому

    👍🏻👍🏻👍🏻

  • @lastfornit
    @lastfornit 3 роки тому

    теория- это хорошо. хорошо объяснённая теория - ещё лучше. но без практики некоторый туман в понимании остаётся. прям, не хватает практического обучения SQL с нуля.

  • @evgeniy_blinov
    @evgeniy_blinov 3 роки тому

    Не очевидно, почему вдруг операторы сравнения исключают индексирование. B-tree целиком построено на сравнениях. Ощущение, что лектор не очень хорошо понимает, как устроены индексы.

    • @VladimirMozhenkov
      @VladimirMozhenkov  3 роки тому

      Не очевидно, потому что не исключают.

    • @evgeniy_blinov
      @evgeniy_blinov 3 роки тому

      @@VladimirMozhenkov в ролике сказано, что идексы похдходят только для случаев, где у нас сравнение на равенство, но не на больше / меньше

  • @Sweet-kc1oz
    @Sweet-kc1oz 2 роки тому

    Почему для like не нужен индекс? Наверно речь идёт о неопределенном начале строки? Like % ... %
    Для like ... % индекс ускорит работу

  • @Doox911
    @Doox911 3 роки тому

    Топ

  • @שלוםעליכם-ת9ס
    @שלוםעליכם-ת9ס 9 років тому +1

    Ролик конечно же полезный, но в нём не рассматриваются ситуации использования ORM, например Hibernate.

    • @שלוםעליכם-ת9ס
      @שלוםעליכם-ת9ס 8 років тому

      +Beta Вот про эти запросы и следует поговорить. Ведь именно от них зависит, стоит или не стоит создавать индекс.

    • @שלוםעליכם-ת9ס
      @שלוםעליכם-ת9ס 8 років тому

      ***** В ролике говорится про запросы, явно формируемые программистом. Как это делает ORM неочевидно.

    • @stMrJerry
      @stMrJerry 8 років тому

      ну так это уже твоя задача знать какие запросы делает твоя ORM
      тем более что обычно ORM позволяет привести любое выражение к sql-запросу через специальный метод

    • @שלוםעליכם-ת9ס
      @שלוםעליכם-ת9ס 8 років тому

      Jerry Green
      ORM для того и создавались, чтобы не заморачиваться SQL запросами.

    • @stMrJerry
      @stMrJerry 8 років тому

      שלום עליכם ну так и не заморачивайся. Ваще забей на индексы, запросы, на все. Иди работай бухгалтером)

  • @MRaynold
    @MRaynold 2 місяці тому

  • @АлексейЛысюк-ь4я
    @АлексейЛысюк-ь4я 2 роки тому

    Подытожу. Программист сам должен прикинуть что, как часто и зачем используется, вычислить в мозгу примерный баланс затрат времени на запись/чтение и выродить. Современные базы данных настолько интеллектуальны, что сами такого не могут. Это как дать им инструкцию вылить ведро воды на грядку. Это нужно найти ведро, найти где его наполнить водой, налить туда воды, принести к грядке и дать современной СУБД вылить воды.
    Т.е. 99,987259% трудозатрат выполнит все равно человек. СУБД гордо выльет воду!
    Программистов надо имхо убивать. А то их бесконтрольтное размножение приводит к распространению всяких опусов типа виндовс. Или линукс. Да почти всего. Си++ хоть вспомните. Или яву. Скрипт.
    В первую очередь конечно надо убивать сиобразов. Вот это пздц багогенераторы в сотой степени! (Любители бл..ть краткости, су..0 сестры таланта.) Генераторы "надежных" решений основанных на иерархических структурах кое как налепленного эклектичного говна на еще большем говне. Авианосцы пристроенные к дачному туалету.

  • @MELkey3
    @MELkey3 Рік тому

    Херню рассказал, равенство на хэш, больше/менш и т.д. на на битри ,есть ещё пару десятков алгоритмов, но они специфичны

  • @CoricComPlus
    @CoricComPlus 8 років тому +2

    Володя, я думаю, тебе нужно подтянуть теоретическую часть, исходя из досмотренного видео до 5:25 :)
    Это утверждение насчет того, что создавайте индексы только по тем полям, которые будут находиться в фильтре - морально устарело.
    Во-первых: все мы знаем, что индекс хорош при фильтрации (чтобы план выполнения не делал table scan, перебирая и блокируя записи, а делал seek, что к блокировке не приводит, и сразу имеется дерево для поиска )
    Но он якобы плох при изменении данных, поскольку изменение данных будет выполняться медленно из-за изменения индексов.
    Значит, это может быть и было актуально, но лет 10 назад, когда были медленные диски, и RAM ужасно дорогая.
    Сейчас вычислительные можности позволяют, а многие теоретики даже рекомендуют (а я это на своей шкуре прочувствовал) ставить индексы на _все_ поля.
    Все - по шаблону, поскольку за нас уже все придумано:
    1) В каждой таблице должно быть поле суррогатного первичного ключа (ID, даже если сейчас и не нужно)
    2) В каждой таблице каждое поле должно быть проиндексировано - по индексу на каждое поле
    3) Очень желательно иметь натуральный (даже составной) уникальный индекс, который служит для выделения сущности, и для поддержания обеспечения целостности.
    И забудем мы надолго овертаймы, падения производительности при очередном билде и т.д.: сегодня по этому полю where не ставится, а завтра - оно и попадет в фильтр. И че теперь - включать какой-нибудь tuning advisor чтобы он нам подсказал, где надо ставить индекс?
    А про то, что индекс на like не нужен - это неправда, которую две недели назад фиксил индексами (ечли чо - старючий MS SQL 2005) :)

    • @stMrJerry
      @stMrJerry 8 років тому

      Тоже не понял прикола. Вроде бы sql запросы на то и сделаны, чтобы еще до непосредственно получения данных описать какие данные тебе нужны)

    • @CoricComPlus
      @CoricComPlus 8 років тому +1

      Jerry Green sql - это структурированный язык запросов данных, а не описыватель каких-то метаданных :) да и select * from blablabla (очень плохой запрос) - "какие данные нужны" все зависит от источника данных, а если его расширяют - то изменится

    • @stMrJerry
      @stMrJerry 8 років тому

      A. Z. ну а что есть "язык запросов"? Ты описываешь что ты запрашиваешь - после чего это получаешь. Не наоборот.

    • @CoricComPlus
      @CoricComPlus 8 років тому +1

      Jerry Green Как-то безграмотно пишешь. Я не описываю, _что_ я хочу получить. Я описываю, _как_ я хочу получить. Посредством структуры запросов. Мы не говорим про структуры данных :)

    • @roman8745
      @roman8745 5 років тому +3

      странно что никто за 3 года не написал не придерживаться мнения изложенном в этом комментарии. уже давно есть люди которые специализируются по database performance tuning и с ваших слов они уже как 10 лет никому не нужны так как можно установить индекс на каждый столбец отдельно. открою секрет но seek не всегда выполняется быстрее чем table scan (в некоторых случаях он лучше и выполняется намного быстрее), не говоря уже о композитных индексах которые также с ваших слов не нужны. сравните перфоманс insert/update таблицы с множеством атрибутов и данных с установленным индексом на каждый.
      при каждом изменении запроса и требований изменяется структура таблицы если это нужно,

  • @blusterhash
    @blusterhash 9 років тому +2

    Вроды бы для запросов с like вида "%something", "something%" и "%something%" index будет полезен

    • @tarasbmal
      @tarasbmal 6 років тому

      Однозначно, коллега! )

  • @MrBulat1
    @MrBulat1 5 років тому +1

    Спасибо!!!

  • @МихаилДетков-л8д
    @МихаилДетков-л8д 4 роки тому

    Спасибо!

  • @Boiko777
    @Boiko777 3 роки тому

    Спасибо!

  • @kutuzov13
    @kutuzov13 Рік тому

    Спасибо!