Проблем с производителността на MySQL поради множество полета за дата

Имам този проблем; Имам две таблици, една, която ще нарека tableA, и втора, tableB.

Между две таблици има релация 1:n и в двете има полета за дата; нека обясня с пример

TableA
id|dateA|others

TableB
id|id_tablea|dateb1|sold|dateb2

Съединението между тези таблици е тривиално, проблемът ми е, когато трябва да филтрирам по дата; като изискване трябва да използвам d

1) dateb2 ако и само ако е продаден = 1 (ако има запис в tableb) 2) else dateb1 (ако има запис в tableb) 3) datea1

Това е пример за заявка:

SELECT * FROM
tableA ta
LEFT JOIN
tableB tb on ta.id = tb.id_tablea
WHERE 
(
if(tb.sold=1,tb.dateb2,( IFNULL(tb.dateb1,ta.datea1))
)
BETWEEN 'INT1'  AND 'INT2'
AND >
...

Проблемът ми е, че и двете таблици са много големи и заявката отнема много време; как мога да оптимизирам тази заявка? някаква идея?

Благодаря предварително


person GFCoder977    schedule 21.04.2016    source източник
comment
Моля, проверете подобни въпроси, които са изброени в колоната вдясно. Ще видите подхода, който хората предприемат, от предоставянето на достатъчно информация до оптимизациите. Не можем да направим нищо с вашето запитване, без никаква представа колко информация връщате, какво означава много голям според вашите термини (имаме числа в ИТ, можем да ги използваме, за да изразим величината) и какво прави MySQL зад кулисите + каква е конфигурацията на вашия сървър.   -  person Mjh    schedule 21.04.2016


Отговори (1)


Една идея може да бъде да се отървем от if/else:

Предполагам, че ако sold все още не е 1, dateb2 е невалиден или може да носи произволна стойност. След това можете да запазите dateb2 равно на dateb1, докато sold != 1. След това винаги можете да изберете на dateb2, без значение дали sold е зададено или не.

И сега можете да създадете индекс за dateb2, което вероятно ще увеличи и производителността.

Ако предположението по-горе е погрешно, можете да помислите за допълнителна колона dateb3, която се поддържа равна на dateb2, ако се продава == 1, и равна на dateb1 в противен случай, заедно с индекс над dateb3.

person Aconcagua    schedule 21.04.2016