生產庫中遇到mysql的子查詢
使用過oracle或者其他關聯式資料庫的DBA或者開發人員都有這樣的經驗,在子查詢上都認為資料庫已經做過優化,能夠很好的選擇驅動表執行,然後在把該經驗移植到mysql資料庫上,但是不幸的是,mysql在子查詢的處理上有可能會讓你大失所望,在我們的生產系統上就由於碰到了這個問題:
select i_id, sum(i_sell) as i_sell
from table_data
where i_id in (select i_id from table_data where Gmt_create >= ‘2011-10-07 00:00:00’)
group by i_id;
(備註:sql的業務邏輯可以打個比方:先查詢出10-07號新賣出的100本書,然後在查詢這新賣出的100本書在全年的銷量情況)。
這條sql之所以出現的效能問題在於mysql優化器在處理子查詢的弱點,mysql優化器在處理子查詢的時候,會將將子查詢改寫。通常情況下,我們希望由內到外,先完成子查詢的結果,然後在用子查詢來驅動外查詢的表,完成查詢;但是mysql處理為將會先掃描外面表中的所有資料,每條資料將會傳到子查詢中與子查詢關聯,如果外表很大的話,那麼效能上將會出現問題;
針對上面的查詢,由於table_data這張表的資料有70W的資料,同時子查詢中的資料較多,有大量是重複的,這樣就需要關聯近70W次,大量的關聯導致這條sql執行了幾個小時也沒有執行完成,所以我們需要改寫sql:
SELECT t2.i_id, SUM(t2.i_sell) AS sold
FROM (SELECT distinct i_id FROM table_data
WHERE gmt_create >= ‘2011-10-07 00:00:00’) t1, table_data t2
WHERE t1.i_id = t2.i_id GROUP BY t2.i_id;
我們將子查詢改為了關聯,同時在子查詢中加上distinct,減少t1關聯t2的次數;
改造後,sql的執行時間降到100ms以內。
相關文章
- MySQL資料庫基礎——多表查詢:子查詢MySql資料庫
- MYsql 子查詢MySql
- MySQL子查詢MySql
- Mysql中的巢狀子查詢問題QSBSMySql巢狀
- MySQL之連線查詢和子查詢MySql
- MySQL 相關子查詢MySql
- 【MySQL】檢視&子查詢MySql
- MySQL like查詢字元轉義遇到的坑MySql字元
- mysql-分組查詢-子查詢-連線查詢-組合查詢MySql
- MySQL中跨庫查詢怎麼搞?MySql
- MYSQL學習筆記26: 多表查詢|子查詢MySql筆記
- MySQL全面瓦解11:子查詢和組合查詢MySql
- MYSQL學習筆記25: 多表查詢(子查詢)[標量子查詢,列子查詢]MySql筆記
- 查詢MySQL資料庫,MySQL表的大小MySql資料庫
- SQL查詢的:子查詢和多表查詢SQL
- 2018-11-21MySQL建學生表資料庫+查詢MySql資料庫
- Mysql 巢狀查詢100例子MySql巢狀
- 生產中遇到 cpu 過高排查
- 【從零開始學習 MySql 資料庫】(3) 函式與子查詢和連線查詢MySql資料庫函式
- 15、Oracle中的高階子查詢Oracle
- mysql中的多表關聯查詢MySql
- 探究MySQL中SQL查詢的成本MySql
- 遇到慢查詢怎麼辦?一文解讀MySQL 8.0查詢分析工具MySql
- mysql求交集:UNION ALL合併查詢,inner join內連線查詢,IN/EXISTS子查詢MySql
- 複雜查詢—子查詢
- 資料庫學習(五)子查詢資料庫
- 【資料庫】MySQL查詢優化資料庫MySql優化
- 《MySQL 入門教程》第 19 篇 子查詢MySql
- mysql 的delete from where 子查詢的一些限制MySqldelete
- MySQL 優化五(關聯查詢子查詢以及 in 的效率問題)(高階篇)MySql優化
- Oracle分組查詢中包含子查詢列,發生ORA-00937:不是單分組函式的錯誤Oracle函式
- MySQL 查詢中保留 IN 中的順序MySql
- MySql中的資料查詢語言(DQL)三:連線查詢MySql
- MySQL實現樹狀所有子節點查詢的方法MySql
- PHP連線、查詢MySQL資料庫PHPMySql資料庫
- MySQL exists關聯子查詢SQL效能及其低下最佳化之等值子查詢轉換MySql
- 理解索引(中):MySQL查詢過程和高階查詢索引MySql
- Mysql基礎+select5種子句 + 子查詢MySql
- 子串查詢