Проблема с производительностью MySQL из-за нескольких полей даты

У меня есть эта проблема; У меня есть две таблицы, одну я назову tableA, а вторую — tableB.

Между двумя таблицами существует отношение 1:n и в обеих из них есть поля даты; позвольте мне объяснить на примере

TableA
id|dateA|others

TableB
id|id_tablea|dateb1|sold|dateb2

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

1) dateb2 тогда и только тогда, когда продано = 1 (если запись в таблице b присутствует) 2) else dateb1 (если присутствует запись в таблице b) 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:

Я предполагаю, что если продано еще не 1, dateb2 недействителен или может иметь любое произвольное значение. Затем вы можете сохранить dateb2 равным dateb1, если продано! = 1. Тогда вы всегда можете выбрать dateb2, независимо от того, установлено ли продано или нет.

И теперь вы можете создать индекс для dateb2, что, вероятно, также повысит производительность.

Если приведенное выше предположение неверно, вы можете рассмотреть возможность создания дополнительного столбца dateb3, который сохраняется равным dateb2, если продано == 1, и равным dateb1 в противном случае, вместе с индексом над dateb3.

person Aconcagua    schedule 21.04.2016