字元校驗集問題導致索引無法正常使用
今天一個開發人員找說諮詢一個sql子查詢問題:
sql類似如下:
explain select col1,count(1) from xxx r where custuid>0 and xx=0 and xx in (xxx,xx)
and exists (SELECT 1 from yyy sp where sp.col2=r.col2
LIMIT 1) group by col1;
兩個表都不大,都不到十萬,正常情況應該很快就能執行出結果,結果一直執行不動。
分析原因首先檢視執行計劃:
可以看到記憶體表居然走了全索引掃描!
檢視關聯列col2上的索引情況,yyy上是單列唯一索引,理論上不可能走全索引掃描,
進一步檢視錶結構發現問題所在了:
原來兩個表的col2欄位雖然都是varchar,但是使用了不同的校驗集:
一個是utf8_bin,另一個是預設的utf8_general_ci
校驗集主要影響的就是字串的排序比較場景。
正是這個原因導致關聯列無法正常使用索引。
解決辦法:兩個表的字符集改成一致即可
alter table xxx modify col2 varchar(30) COLLATE utf8_bin ;
檢視執行計劃:
可以看到eq_ref,索引正常使用了。
嘗試執行:0.02s
問題解決了,雖然很簡單,但是比較隱蔽,前後花了快1小時才找到原因。
後續處理:
再次強調開發人員提交ddl的時候不要自定義字元校驗規則(通常是沒有這個需要的),dba在稽核的時候也注意過濾這些資訊。
sql類似如下:
explain select col1,count(1) from xxx r where custuid>0 and xx=0 and xx in (xxx,xx)
and exists (SELECT 1 from yyy sp where sp.col2=r.col2
LIMIT 1) group by col1;
兩個表都不大,都不到十萬,正常情況應該很快就能執行出結果,結果一直執行不動。
分析原因首先檢視執行計劃:
可以看到記憶體表居然走了全索引掃描!
檢視關聯列col2上的索引情況,yyy上是單列唯一索引,理論上不可能走全索引掃描,
進一步檢視錶結構發現問題所在了:
原來兩個表的col2欄位雖然都是varchar,但是使用了不同的校驗集:
一個是utf8_bin,另一個是預設的utf8_general_ci
校驗集主要影響的就是字串的排序比較場景。
正是這個原因導致關聯列無法正常使用索引。
解決辦法:兩個表的字符集改成一致即可
alter table xxx modify col2 varchar(30) COLLATE utf8_bin ;
檢視執行計劃:
可以看到eq_ref,索引正常使用了。
嘗試執行:0.02s
問題解決了,雖然很簡單,但是比較隱蔽,前後花了快1小時才找到原因。
後續處理:
再次強調開發人員提交ddl的時候不要自定義字元校驗規則(通常是沒有這個需要的),dba在稽核的時候也注意過濾這些資訊。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/20625855/viewspace-1696253/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【RAC】處理VIP資源被佔用導致Cluster叢集軟體無法正常部署問題
- 【epoll問題】EPOLLRDHUP使用導致無法接受資料
- 懷疑私網網路卡多播問題導致crs無法正常啟動
- 前後端頁面分離導致session無法正常獲取的問題後端Session
- multicast導致節點無法加入叢集AST
- 單個分割槽索引失效導致繫結變數查詢無法使用索引索引變數
- ajax的get請求快取導致無法更新問題快取
- 解決hyper v導致docker無法啟動問題Docker
- vim 編輯報錯導致無法正常退出和編輯
- 【隱式轉換】注意隱式轉換將導致索引無法使用索引
- 應用使用JNDI,資料庫無法連線,導致的程序無法啟動問題處理資料庫
- 歸檔問題導致的資料庫無法啟動資料庫
- 索引無法消除排序的問題索引排序
- Standby OS i/o問題導致Primary 庫不能正常歸檔問題
- MySQL連線數過多導致服務無法正常執行MySql
- 11gRAC許可權問題導致的叢集及資料庫無法啟動資料庫
- Oracle 12.1業務使用者使用序列時報ORA-600導致業務無法正常進行Oracle
- 排查 k8s 叢集 master 節點無法正常工作的問題K8SAST
- jdk版本導致tomcat,eclipse無法啟動的問題JDKTomcatEclipse
- Kubernetes node的防火牆問題導致pod ip無法訪問防火牆
- oracle可執行檔案s位導致的Cluster資源組無法正常啟動的問題解決Oracle
- qt6 QtOpcUa無法正常啟動問題QT
- TSM配置不好導致備份不正常,從而導致資料庫效能問題資料庫
- 修改計算機名後導致Oracle無法訪問的問題修復計算機Oracle
- 因為跨域問題導致的無法讀取 response header跨域Header
- win10系統下安裝一些更新時出現問題導致無法正常更新如何解決Win10
- [zt] oracle可執行檔案s位導致的Cluster資源組無法正常啟動的問題解決Oracle
- backup database plus archivelog 不同寫法導致備份集位置不同問題DatabaseHive
- mongoDB非正常關閉後無法啟動問題MongoDB
- 記錄一個SSH client 退格鍵(backspace)無法正常使用的問題client
- Linux下共享庫問題導致無法啟動SQLPLUS的問題解決LinuxSQL
- beego session 根本無法正常使用GoSession
- Oracle全部索引丟失導致的效率問題處理Oracle索引
- 在settings加入AUTHENTICATION_BACKENDS設定導致root使用者無法登入問題
- 無法正常訪問伺服器伺服器
- Linux主機記憶體溢位導致oracle的SYS使用者無法正常登陸Linux記憶體溢位Oracle
- ORACLE DSG資料同步軟體程式導致資料庫無法正常關閉Oracle資料庫
- Workstation服務無法啟動導致無法訪問檔案伺服器伺服器