2015-08-06 2 views
1

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

UPDATE foo SET col1 = CASE col2 
         WHEN 1 THEN 3 
         WHEN 2 THEN 9 
         ... 
         ELSE col1 END 
WHERE col2 IN (1,2...) 

Обратите внимание, что там могут быть тысячи случаев когда тогда. EXPLAIN показывает, что PK будет использоваться для предложения IN, но как база данных вычисляет CASE/WHEN после того, как она фильтрует на основе предложения IN - сканирует ли она все или использует хэш? Я не думаю, что это было бы явным в EXPLAIN (например, без предложения IN).

ответ

1

Вместо тысячи случае, когда заявления, создать еще одну таблицу в базе данных (назовем его keyValueTable), и пусть один столбец будет (ключ) when, а другой в then (значение):

id  colkey  value 
1  1  3 
2  2  9 

сделать colkey уникальные и установить индекс на нем, то запрос к базе данных, как

UPDATE foo SET col1 = (
SELECT value from keyValueTable 
INNER JOIN foo ON keyValueTable.colkey = foo.col1 
LIMIT 1 
) 
WHERE ... 
2

выражение CASE будет утомительно прошло через для каждой строки не отфильтрованной WHERE. Оптимизации нет, поскольку значения WHEN могут быть произвольными выражениями, а не простыми константами, как в вашем случае.

Это может быть быстрее, если у вас есть индекс по col2:

UPDATE foo SET col1 = 3 WHERE col2 = 1; 
UPDATE foo SET col1 = 9 WHERE col2 = 2; 
... 
Смежные вопросы