這個SQL你會最佳化嗎?
來源:DBA札記
1背景
昨天晚上某群友問我一個SQL最佳化問題,我當時在處理公司問題,就讓他丟到群裡大家看。經過大家“我來找茬”,最終問題得以解決。廢話到這裡,上菜。
2問題SQL
SELECT *
FROM table1 t1
WHERE t1.number IN (
SELECT batch_no
FROM table2
WHERE id = '260002'
);
表結構 t1
CREATE TABLE `table1` (
`id` varchar(38) NOT NULL COMMENT 'id',
`number` varchar(50) NOT NULL COMMENT '調整後交易批號',
PRIMARY KEY (`id`),
KEY `idx1` (`number`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COMMENT='交易單明細';
表結構 t2
CREATE TABLE `table2` (
`id` varchar(38) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'id',
`batch_no` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '結算批號',
PRIMARY KEY (`id`),
KEY `idx1` (`batch_no`),
) ENGINE = InnoDB CHARSET = utf8mb3 COMMENT '結算單';
3現象
針對問題SQL,加force index, 各種改寫,都沒法走索引,表資料大概有300w,所以還是有點影響。
4結論
表欄位和表的字符集不一致,查詢的時候發生了隱式轉換。表欄位用了utf8mb4,表預設定義用utf8mb3,混合使用。導致batch_no是utf8mb4, number欄位是utf8mb3。
5解決方案
1、修改字符集
2、改寫SQL select convert(batch_no using utf8) from ....
我個人覺得這個問題的根本原因還是SQL在上線的時候沒有做好稽核,缺乏SQL稽核工具與開發規範約束。
來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70027826/viewspace-3001859/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- React 中你會這 10 個 JavaScript 概念嗎?ReactJavaScript
- 這道js題你會嗎?JS
- 想幫助改善 GNOME 嗎?這個新工具給了你這個機會!
- Myabtis動態SQL,你真的會了嗎?SQL
- java中的Arrays這個工具類你真的會用嗎Java
- 大師級設計師才會的這個CAD技巧,你會嗎?
- 用蘋果手機拍照,連這三個功能你會嗎蘋果
- 天天寫 SQL,這些神奇的特性你知道嗎?SQL
- 這些 SpringBoot 面試題你會嗎?Spring Boot面試題
- 你還在這樣寫SQL嗎?趕緊改改吧SQL
- 求助!有大佬會計算這個嗎
- Redis系列總結--這幾點你會了嗎?Redis
- 這樣的釣魚郵件,你會中招嗎?
- ES6的這些操作技巧,你會嗎?
- 這個設計原則,你認同嗎?
- 這6個高效的Java庫,你知道嗎?Java
- 這5個Ansible 模組你喜歡嗎
- 你會犯這些 Go 編碼錯誤嗎(二)?Go
- 這幾種Java異常處理方法,你會嗎?Java
- Python操作MySQL儲存,這些你都會了嗎?PythonMySql
- 為什麼 Go 用起來會難受?這 6 個細節你知道嗎Go
- 你有 Apple Watch嗎? 這個用處可大了APP
- 熟悉 Vue ?你能解釋這個死迴圈嗎?Vue
- 這20個Docker Command,有幾個是你會的?Docker
- 你不是說你會Aop嗎?
- 你會這道阿里多執行緒面試題嗎?阿里執行緒面試題
- 你會如何改進這個演算法?演算法
- 你會單例嗎?單例
- 你知道黑客的入侵方式都有哪些嗎?這些你知道幾個?黑客
- mongodb想速成嗎,這個系列教程你可以看看(2)MongoDB
- mongodb想速成嗎,這個系列教程你可以看看(1)MongoDB
- 這 20 多個高併發程式設計必備的知識點,你都會嗎?程式設計
- 兩個會話分別只執行一個SQL,可能形成死鎖嗎會話SQL
- 如果讓你手寫個棧和佇列,你還會寫嗎?佇列
- 最新阿里Java面試題,這些面試題你會嗎?阿里Java面試題
- 你確定你會寫 Dockerfile 嗎?Docker
- 看完這個你還不會 插入排序 麼排序
- 你真的瞭解“SQL”嗎?《SQL優化最佳實踐》作者帶你重新瞭解SQLSQL優化