資料庫有3張表,如chinese_score、math_score、english_score,分別代表學生的語文成績、數學成績、英語成績,每張表的表結構和資料量一致,200萬資料量。表結構如下:
id(主鍵)
code(學號)
name(姓名)
score(成績)
執行的sql(獲得每個學生的總成績):
select code, name, sum(t.score) total_score
from
(select code, name, score from chinese_score
union all
select code, name, score from math_score
union all
select code, name, score from english_score
) tgroup by code,name
執行結果
mysql5.6中執行,結果total_score合計正常
mysql5.7中執行,結果total_score的值為語文的成績,沒有合計3個總成績
即如結果中,檢視張三的總成績(語文90、數學85、英語100),5.6版本總成績為275,5.7版本為90
這麼坑,它也沒有報錯,直接資料不對
mysql在以下幾種情況會建立臨時表:
union查詢(mysql 5.7起,執行union all不再產生臨時表,除非需要額外排序。);
本來union all查詢是中間產生臨時表的,但是mysql 5.7不產生臨時表了,估計資料在記憶體了,然後估計資料量超出其限制了,就丟棄後面資料了(只是猜測)
因為我測試過每個150萬資料量沒有問題,而兩個160萬就不對了
select code, name, sum(t.score) total_score
from
(select code, name, score from chinese_score order by code limit 1500000
union all
select code, name, score from math_score order by code limit 1500000
union all
select code, name, score from english_score order by code limit 1500000
) tgroup by code,name
select code, name, sum(t.score) total_score
from
(select code, name, score from chinese_score order by code limit 1600000
union all
select code, name, score from math_score order by code limit 1600000
) tgroup by code,name
所以最終解決方法就是修改sql,新增排序
select code, name, sum(t.score) total_score
from
(select code, name, score from chinese_score
union all
select code, name, score from math_score
union all
select code, name, score from english_score
order by code
) tgroup by code,name
新增了order by code
這樣5.6和5.7執行都是正確的
mysql5.7執行union all不再產生臨時表,那臨時資料是儲存在記憶體麼?
臨時的中間資料如果是儲存在記憶體,那臨界點是多少大小?
這個臨界點是否通過mysql的那個系統引數配置可以調整?
不知道哪位大神可以救救小弟,不勝感激。
調整了 innodb_buffer_pool_size,預設128m,調整256m後測試,可以問題,因此跟innodb_buffer_pool_size存在關係
終採用union all調整為inner jion方式就不會涉及該問題
mysql5 7學習 mysql 5 7 學習
mysql uroot proot mysql5.7 mysql.user表沒有password欄位改 authentication string 一.建立使用者 命令 create user username host identified by password 例子 create user d...
mysql57 MySQL57安裝與設定
安裝mysql 新增mysql源 安裝mysql root localhost yum y install mysql community server 啟動mysql 檢查狀態 設定為開機自啟 root localhost systemctl start mysqld root localhost...
mysql 中 union all的使用
有時在查詢語句中有or等出現時,如果查詢速度比較慢的話,可以考慮用union all來替換,優化查詢。如下 select name from tablea where 條件1 union all select name from tableb where 條件2 如果要加limit,可以這樣寫 se...