我们刚刚从MySQL 5.5.20迁移到MariaDB 5.5.50 我在一个查询中遇到了一个非常奇怪的问题。
此查询适用于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
玛丽亚扩展扩展:
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
如果我在最后一个句子中替换OR的顺序,则它适用于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
有人发现任何类似的奇怪问题吗?在配置等方面是否有任何解决方案......我在网上找不到任何解决方案。如果它是MariaDB中的一个错误,它会在从MySQL切换时带来很多变化。
谢谢,
答案 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
通常无法优化,如果存在差异,我会感到惊讶。
让我们看看两台机器上的索引。