2014-10-20 2 views
1

Мне нужна конструкция sql, которая дает следующую функциональность.if else clause в sql, автоматическая перестройка индексов

select if-expression if status='regular' else else-expression 
from table-name ; 

Эта операция будет использоваться очень часто. Итак, я рассматриваю возможность создания индекса для этой операции.

Но, я слышал, что индексы не перестраиваются после обновления таблицы. Есть ли способ автоматически перестроить индексы?

Заранее спасибо

+1

Единственные временные индексы не обновляются при изменении таблицы, вы фактически отключите их (например, во время операций массовой загрузки). Обычно они должны ВСЕГДА автоматически обновлять. –

+0

(+1) Потому что: Требуется использовать ту же функцию в производственном коде. Это не очень распространено, но иногда требуется бизнес-логикой клиентов/стеков. – umlcat

ответ

1

Перевод в SQL вашего утверждения:

select (case when status = 'regular' then <if-expression> else <else-expression> end) 
from tablename; 

Индекс не поможет с этим запросом, потому что вы не ограничивая строки в любом случае. Индекс может помочь, когда у вас есть фильтры в предложении where, объединяет и коррелирует подзапросы (а иногда я думаю с group by).

И как отмечает MarcB в комментарии, MySQL (и все другие базы данных) постоянно обновляют индексы для операций вставки, обновления и удаления.

+0

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

+0

@sandilya. , , Если ваш результирующий набор возвращает все строки в исходной таблице, накладные расходы на сравнение столбца «status» действительно незначительны. –

0

Вы не представили более подробный пример.

Существует несколько альтернативных решений вашей идеи, а не только «использование-index-luke-solution». И многое зависит от вашей базы данных.

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

SELECT 
    <if-expression> 
FROM 
    MyTable 
WHERE 
    (MyTable.status = 'regular') 

UNION 

SELECT 
    <else-expression> 
FROM 
    MyTable 
WHERE 
    (MyTable.status <> 'regular') 

И, в некоторых случаях, вы можете добавить

SELECT 
    <if-expression> 
FROM 
    MyTable 
WHERE 
    (MyTable.status = 'regular') 
ORDER BY <indexed-fields-used-in-expression> 


UNION 

SELECT 
    <else-expression> 
FROM 
    MyTable 
WHERE 
    (MyTable.status <> 'regular') 
ORDER BY <indexed-fields-used-in-expression> 

Приветствия.