2016-09-30 55 views
0

我們剛從MySQL 5.5.20遷移到MariaDB 5.5.50 我發現一個查詢很奇怪的問題。Mariadb - 解釋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 

Then ...

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上的一行。瑪麗亞的成績是空的。重新排列的OR的第二個返回兩行上的一行。表za_faktura有大約65000行。 –

+0

請驗證數據集和查詢是否相同,然後用mariadb.com提交錯誤。 –