这里有第一个问题,所以要好看: - )
我曾经在我的所有服务器上使用MySQL,因为Cent OS 7现在配备了MariaDB instea,我试了一下。一切似乎都很好,除了一个查询,MySQL以毫秒为单位执行而MariaDB需要几秒钟:(
SELECT * FROM (
SELECT id, date_start FROM matches
WHERE matches.type =5409
AND matches.status =10
AND matches.date_start >= '2016-02-01'
AND matches.date_start <= '2016-02-08'
) AS tmp
INNER JOIN seat ON tmp.id = seat.match_id
桌席拥有540万个参赛作品,比赛中有三分之一。每场比赛都有3个席位。
现在,MySQL首先巧妙地派生出tmp表,然后加入仅在给定时间范围内找到的112个匹配项:
id select_type table type possible_keys key len ref rows Extra
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 112
1 PRIMARY seat ref match_id match_id 8 tmp.id 3
2 DERIVED matches ALL NULL NULL NULL NULL 1919638 Using where
另一方面,MariaDB首先在整个匹配表上执行JOIN。 500万条目并不那么聪明:
id select_type table type possible_keys key len ref rows Extra
1 SIMPLE seat ALL match_id NULL NULL NULL 5462345
1 SIMPLE matches eq_ref PRIMARY PRIMARY 8 seat.match_id 1 Using where
match_id是座位表中的一个键。
我尝试了不同的方法,没有任何效果。我还不想放弃MariaDB,因为我读过它并且还注意到自己在其他查询上有点快。但这实际上是一个显示阻止......
所以任何帮助都会非常感激!
答案 0 :(得分:0)
matches
:
INDEX(type, status, date_start)
将加速MySQL和MariaDB。 (type
和status
可以互换,但date_start
需要排在第三位。)
产生差异的原因是MySQL在某些优化方面领先于MariaDB,而且你遇到了这样的优势。