ОБНОВЛЕНИЕ КЛЮЧЕВЫХ КЛЮЧЕЙ - приоритет - PullRequest
3 голосов
/ 26 марта 2019

При выполнении INSERT INTO {tableA} SELECT a,b,c FROM {tableB} ON DUPLICATE KEY UPDATE x=y

Каков приоритет при оценке дубликатов ключей? Я предполагаю, что MySQL сначала проверяет, существует ли кортеж из tableB, столкновения с уникальным / первичным ключом в tableA. Если SELECT не включает первичный ключ или другой дублирующий ключ не существует, то оценивается каждая последующая «группа» УНИКАЛЬНОГО ИНДЕКСА и выполняется такая же проверка. Но что произойдет, если ваша таблица B имеет несколько наборов уникальных многоколоночных индексов? Оцениваются ли они сверху вниз, как описано SHOW INDEXES FROM tableB?

Вот мой SHOW INDEXES FROM <table>:

Table,Non_unique,Key_name,Seq_in_index,Column_name,Collation
daily_metrics,0,PRIMARY,1,id,A
daily_metrics,0,unique_lineItem_creative_y_m_d,1,line_item_id,A
daily_metrics,0,unique_lineItem_creative_y_m_d,2,creative_id,A
daily_metrics,0,unique_lineItem_creative_y_m_d,3,year,A
daily_metrics,0,unique_lineItem_creative_y_m_d,4,month,A
...

Представьте, что есть дополнительные наборы уникальных индексов, похожих на unique_lineItem_creative_y_m_d

Документы, похоже, не иллюстрируют это поведение. https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html

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

Ответы [ 2 ]

2 голосов
/ 26 марта 2019

Вы правы: как только MySQL обнаруживает дубликат в любом индексе UNIQUE, он отменяет INSERT и выполняет обновление.

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

Планировщик запросов MySQL, надеюсь, выбирает индекс, который будет наименее затратным для оценки.Но, формально говоря, индекс, который он использует для этой цели, является непредсказуемым. Это непредсказуемость является атрибутом декларативных языков, таких как SQL.MySQL может выполнять свою работу любым удобным для вас способом, и вам не нужно об этом говорить.Программистам сложно понять, потому что мы привыкли к процедурным языкам.

1 голос
/ 26 марта 2019

Если в tableB существуют какие-либо первичные или уникальные ключи, это не имеет значения. Единственное, что имеет значение для INSERT...ON DUPLICATE KEY UPDATE - это первичные или уникальные ключи таблицы, в которую вы вставляете - tableA в вашем примере.

Если значения, которые вы вставляете в tableA, уже найдены в любом из первичных или уникальных ключей tableA, то запускается часть UPDATE IODKU.

Речь идет о вставляемых значениях, а не об ограничениях исходной таблицы.

Вы также можете вызвать UPDATE без использования исходной таблицы - просто вставив предложение VALUES() с набором констант.

...