在MySQL 5.6.34(我的新開發服務器)和MariaDB 10.2.8(我的新生產服務器,我認爲我今天終於部署代碼的地方 - 完全相同的數據庫結構和數據 - 嘆氣!),MySQL正在工作,而MariaDB不在。這是在MySQL 5.0.95上工作良好的代碼。我將查詢簡化爲顯示問題的最小示例 - 似乎GROUP_CONCAT()
和子查詢不混合。下面是該查詢:MariaDB:group_concat子查詢失敗
SELECT person.PersonID,
GROUP_CONCAT(CategoryID ORDER BY CategoryID SEPARATOR ',') AS categories
FROM person LEFT JOIN percat ON person.PersonID=percat.PersonID
WHERE person.PersonID IN (SELECT PersonID FROM action WHERE ActionTypeID=3)
GROUP BY person.PersonID
,這裏是屏幕截圖,顯示所有三個表所涉及的結構的複合圖像:
在MySQL,它工作得很好,因爲它一直多年。下面是結果和EXPLAIN
:
這是瘋狂的結果我得到MariaDB的:
我不知道數據庫引擎不夠好內部工作按照EXPLAIN
,但我認爲線索是在那裏。我發現這聽起來有點相關,但我不太明白他們在說什麼,更重要的是,我應該怎麼處理這件事。
我似乎無法打開如果關閉 - 顯然我做錯了。在'/ etc/my.cnf',section ['mysqld]'中,我添加了'optimizer_switch = orderby_uses_equalities = off'(我嘗試了使用和不使用單引號 - 我在網絡上看到了這兩個示例)並重新啓動了mysqld也有奇怪的行爲 - 它不會給我的ssh提示符,直到我等待一段時間後按^ C)。但是'SELECT @@ optimizer_switch \ G'表示'orderby_uses_equalities'仍然打開,並且查詢行爲沒有變化。 – OsakaWebbie
該部分和線條都很好。首先,檢查你的服務器實際上是否重啓(例如,通過驗證'SHOW STATUS LIKE'Uptime''和/或錯誤日誌)。聽起來服務器並沒有真正關閉,然後嘗試重新啓動,並開始爭奪數據庫,例如用於鎖定詠歎調控制文件等。如果服務器確實重新啓動,另一個可能的原因是您的安裝不使用此cnf文件。你可以在optimizer_switch之後放置一些獨特的東西,例如'lock_wait_timeout = 42'(或者你會認識的任何東西),看看它是否被拾取。 – elenst
是的,就是這樣 - 它沒有真正重新啓動(我錯誤地執行了命令)。你的解決方法就像一個魅力!當我有更多的時間時,我會致力於簡化我的代碼,但現在,我可以繼續推動我的新服務器,謝謝你。 – OsakaWebbie