Подтвердить что ты не робот

Получают ли запросы обновления mysql от индекса?

У меня есть таблица, которую я обычно обновляю, и мне интересно, могут ли запросы обновления получить индекс в столбце where и обновленном столбце или индексе только где столбец?

4b9b3361

Ответ 1

Просто на столбе. Индекс в столбце обновления фактически замедлит ваш запрос, потому что индекс должен обновляться вместе с данными. Индекс столбца where ускоряет обновления и выбирает, но замедляет некоторые вставки.

Индексы также вызывают накладные расходы при удалении строк. В общем, это хорошо, хотя на столбцах, которые вы используете WHERE на большом количестве, и они в основном необходимы для столбцов, на которые вы присоединяетесь, или ORDER BY

Ответ 2

Большинство людей здесь не знают, как индексы работают в MySQL.

Это зависит от используемого механизма хранения. InnoDB использует индексы, полностью отличные от MyISAM. Это связано с тем, что MySQL реализует индексы на уровне уровня хранения, а не на уровне сервера MySQL.

Я боюсь, что большинство людей здесь дают ответы на основе других баз данных, в которых индексы работают по-разному из MySQL.

InnoDB

В случае InnoDB. Это связано с тем, что всякий раз, когда строка обновляется в InnoDB, индекс также должен быть обновлен, так как индексы InnoDB's должны быть последовательными, поэтому необходимо выяснить, на какой странице node индекса он должен быть там и вставлен там. Иногда эта страница может быть полной, поэтому она должна разделять страницу, теряя пространство и увеличивая время. Это происходит независимо от того, какой индекс вы индексируете, поскольку InnoDB использует кластерные индексы, где индекс хранит данные всей строки.

MyISAM

В случае с MyISAM у этой проблемы нет. MyISAM фактически использует только один индекс столбца, даже если вы можете установить несколько уникальных значений на более чем 1 столбец. Кроме того, индекс MyISAM's не сохраняется последовательно, поэтому обновления очень быстрые. Аналогично, вставки также бывают быстрыми, так как MyISAM просто вставляет его в конец строки.

Заключение

Итак, что касается вашего вопроса, вы должны рассмотреть свой дизайн схемы, а не беспокоиться о том, будет ли запрос использовать индексы. Если вы в основном обновляете таблицу, я предлагаю вам не использовать InnoDB, если вам не нужна блокировка на уровне строк, высокая concurrency и транзакции. В противном случае MyISAM будет намного лучше для задач обновления. И нет, если вы используете индексы InnoDB, действительно не помогают при обновлении, особенно если таблица очень большая.

Ответ 3

Не прямой ответ для этого. Так вот.

UPDATE table SET ColumnA = 'something' 

если индекс существует в ColumnA, тогда вы получите небольшое повышение производительности, так как для каждой строки будут две операции записи. Сначала данные в таблице, а затем запись для обновления индекса.
У вас может быть даже несколько индексов, каждый из которых имеет ColumnA как часть индекса, что означает, что у вас будет несколько записей в дополнение к строке таблицы. Вы можете видеть, как более чем несколько индексов могут начать действительно замедлять ваши обновления.
Но если ColumnA вообще не индексируется, это будет единственная запись только для каждой строки.

UPDATE table SET ColumnA = 'something' WHERE ColumnB = 'something else'

Для этого запроса, если индекс существует в ColumnB, а не в ColumnA, будет очень быстро найти запись (называемую поиском) и одну запись для обновления, и поскольку индекс не заботится о столбце A, это не нужно обновлять.
Но если вы индексируете ColumnA, а не ColumnB, сначала вы будете читать каждую строку в таблице (называемую сканированием и обычно плохой), которая, хотя чтение быстрее, чем запись, все еще очень медленная, то он будет писать в таблицу, а затем другую запись для индекса. В основном самый медленный способ делать вещи.

DELETE table WHERE ColumnB = 'somethingelse'

Теперь, если у вас есть индекс в любом столбце в этой таблице, две записи, удаление из таблицы и обновление/удаление записи в индексе.
Опять же, если ColumnB не проиндексирован, вы сканируете таблицу, затем удалите строки из таблицы и индексы обновления, если они есть.

INSERT INTO table (ColumnA, ColumnB) VALUES ('something','something else')

Если индексов нет, одна запись в таблицу и ее выполнение.
Опять же, если индексы действительно существуют, то дополнительная запись для каждого.

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

Теперь вернемся к вашему. В принципе, если вам нужно обновить определенную запись, индекс поможет вам найти эту запись быстрее, чем сканировать всю таблицу. Время, затраченное на поиск записи, будет намного больше, чем потеря времени, обновляющего индексы. Если вы только вставляете и никогда не читаете, то индексы замедлят вас. Это становится балансом. Если вам нужно прочитать конкретные записи, то индекс поможет очень. Но чем больше индексов, тем медленнее записываются записи.