MySQL5 7 union all 大資料量問題

2021-10-06 03:43:10 字數 2327 閱讀 1551

資料庫有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...