2016-09-30 5 views
0

Мы просто перешли из MySQL 5.5.20 в MariaDB 5.5.50 Я сталкиваюсь с очень странной проблемой с одним запросом.Mariadb - интерпретация where where depedns на условиях порядка

Этот запрос работает на Mysql, но не на MariaDB:

SELECT 'za_faktura' AS tabulka, 
     za_faktura.id, 
     za_faktura.r_cislo, 
     za_faktura.o_za_platba, 
     za_faktura.a_vystaveni, 
     za_faktura.a_splatnost, 
     za_faktura.a_zaplaceno, 
     0   AS storno, 
     za_faktura.p_fakturovano, 
     za_faktura.p_fakturovano_mena, 
     za_faktura.p_fakturovano_dph, 
     za_faktura.p_fakturovano_dph_mena, 
     za_faktura.p_zaplaceno, 
     za_faktura.p_zaplaceno_mena, 
     za_faktura.p_zaplaceno_dph, 
     za_faktura.p_zaplaceno_dph_mena 
FROM za_faktura 
     INNER JOIN zamn_zakazky_faktury 
       ON zamn_zakazky_faktury.i_za_faktura = za_faktura.id 
WHERE zamn_zakazky_faktury.i_za_zakazka = '27580' 
     AND za_faktura.i_od = '6660' 
     AND za_faktura.i_pro = '3916' 
     AND za_faktura.p_fakturovano >= '600.00' 
     AND za_faktura.p_fakturovano_mena = 'CZK' 
     AND ((za_faktura.id = '26282' 
       AND za_faktura.p_fakturovano_mena = 'CZK' 
       AND za_faktura.p_fakturovano > '600') 
       OR (za_faktura.id = '26243' 
        AND za_faktura.p_fakturovano_mena = 'CZK' 
        AND za_faktura.p_fakturovano > '3000') 
       OR (za_faktura.id <> '26282' 
        AND za_faktura.id <> '26243')) 
ORDER BY za_faktura.p_fakturovano - '600.00' ASC 

EXPLAIN EXTENDED от Марии:

id select_type table type possible_keys key key_len ref rows filtered Extra 
1 SIMPLE zamn_zakazky_faktury range PRIMARY   PRIMARY 4       NULL 4 75.00 Using where; Using index; Using temporary; Using f... 
1 SIMPLE za_faktura   eq_ref PRIMARY,i_od,i_pro PRIMARY 4 guidepraguecz.zamn_zakazky_faktury.i_za_faktura 1 100.00 Using index condition; Using where 

Если я заменил порядок ПРС в последнем пункте он работает с MariaDB:

id select_type table type possible_keys key key_len ref rows filtered Extra 
1 SIMPLE zamn_zakazky_faktury ref PRIMARY     PRIMARY 4 const    4 100.00 Using where; Using index; Using temporary; Using filesort 
1 SIMPLE za_faktura    eq_ref PRIMARY,i_od,i_pro PRIMARY 4 guidepraguecz.zamn_zakazky_faktury.i_za_faktura 1 100.00 Using index condition; Using where 

Затем ...

SELECT 'za_faktura' AS tabulka, 
     za_faktura.id, 
     za_faktura.r_cislo, 
     za_faktura.o_za_platba, 
     za_faktura.a_vystaveni, 
     za_faktura.a_splatnost, 
     za_faktura.a_zaplaceno, 
     0   AS storno, 
     za_faktura.p_fakturovano, 
     za_faktura.p_fakturovano_mena, 
     za_faktura.p_fakturovano_dph, 
     za_faktura.p_fakturovano_dph_mena, 
     za_faktura.p_zaplaceno, 
     za_faktura.p_zaplaceno_mena, 
     za_faktura.p_zaplaceno_dph, 
     za_faktura.p_zaplaceno_dph_mena 
FROM za_faktura 
     INNER JOIN zamn_zakazky_faktury 
       ON zamn_zakazky_faktury.i_za_faktura = za_faktura.id 
WHERE zamn_zakazky_faktury.i_za_zakazka = '27580' 
     AND za_faktura.i_od = '6660' 
     AND za_faktura.i_pro = '3916' 
     AND za_faktura.p_fakturovano >= '600.00' 
     AND za_faktura.p_fakturovano_mena = 'CZK' 
     AND ((za_faktura.id <> '26282' 
       AND za_faktura.id <> '26243') 
       OR (za_faktura.id = '26282' 
        AND za_faktura.p_fakturovano_mena = 'CZK' 
        AND za_faktura.p_fakturovano > '600') 
       OR (za_faktura.id = '26243' 
        AND za_faktura.p_fakturovano_mena = 'CZK' 
        AND za_faktura.p_fakturovano > '3000')) 
ORDER BY za_faktura.p_fakturovano - '600.00' ASC 

Имейте enyone найти любую симпатичную странную проблему? Есть ли какие-либо решения в конфигурации и т. Д. Я не могу найти их в сети. Если это ошибка в MariaDB, это приводит к большому количеству предложений при переключении с MySQL.

Спасибо,

+0

Довольно ясно, что два запроса не являются точно такими же, за исключением порядка двух или условий. –

+0

Я не могу воспроизвести это - вы уверены, что базы данных одинаковы? –

ответ

0

Я не знаю, о «странной проблемы», но этот композитный индекс может ускорить их обоих, так что проблема не имеет значения:

za_faktura: INDEX(i_od, i_pro, p_fakturovano_mena, p_fakturovano) 

Первые 3 столбцы могут быть в любом порядке; последний должен быть последним (из-за того, что он «диапазон»). More discussion.

Часто лучше избегать выражений в ORDER BY:

ORDER BY za_faktura.p_fakturovano - '600.00' ASC -- change to: 
ORDER BY za_faktura.p_fakturovano ASC 

Те, даст вам тот же порядок. Первый не может использовать индекс. (Я не могу точно сказать, будет ли индекс, который я вам дал, заставит его использовать индекс.)

Вы перегруппировали только OR, правильно? Поскольку ORобычно не может быть оптимизирован, я бы удивился, если есть разница.

Давайте посмотрим индексы на двух машинах.

+0

Спасибо, индекс ускоряет запрос, но моя проблема в том, что первый запрос возвращает одну строку только для MySQL. Результат от Марии пуст. Второй с переупорядоченными ORs возвращает одну строку на обоих. Таблица za_faktura имеет около 65000 строк. –

+0

Убедитесь, что наборы данных и запрос совпадают, а затем введите ошибку с помощью mariadb.com. –