一次去o索引建錯引起的血案

2021-09-24 01:35:50 字數 2454 閱讀 4835

故事背景:公司之前的資料庫儲存使用的都是oracle,後面為了跟上時代步伐 進行了一次浩浩蕩蕩的去o過程,首當其衝的就是將oracle換成mysql,在後期幫甲方開發專案我們都統一使用mysql,由於我們的程式是一套程式適配兩個資料庫型別,這樣就出問題了,問題點是突然某一天甲方反饋使用者在高峰期 操作有點慢,對於這種情況,我們一般情況就是優化資料庫建立索引,我們查詢條件主要是前端傳入時間範圍條件,但是沒有做好充分準備(資料庫在甲方沒有做監控),用建立oracle索引方式來建立mysql導致 mysql優化器走錯索引,最終在上線第二天使用者高峰期 導致系統基本處於癱瘓狀態,由於資料庫在甲方 不好排查,後面要求甲方技術將改表匯出 我們做了一次分析 才發現是因為索引失效,重新建立索引後問題解決。

後面做了一次問題過程的回顧 和分析 現分析如下

mysql5.8和oracle11.2 表結構一模一樣 欄位60個 資料量66w

場景一:建立聯合索引 aa(a_date,a_id)  時間列在前查詢語句 這是當時出問題的時候的索引

題外話,mysql分析優化器使用explain查詢 explain for select * from aa;

oracle分析優化器使用sql> explain plan for select * from aa;

sql>select plan_table_output from table(dbms_xplan.display('plan_table'))

mysql查詢結果

oralce查詢結果

場景二:建立聯合索引 aa(a_id,a_date)  時間列在後 查詢語句

mysql查詢結果

oracle查詢結果

結論:根據場景一二,可以證明時間字段作為聯合索引首例容易導致mysql索引優化器異常 甚至不會走改索引而全表掃瞄,而oracle不會走錯索引,後面我們在查詢oracle分析之前的索引,發現很多索引都是時間列在前,當時也沒怎麼想,也直接將oralce的建索引語句直接灌到mysql,導致mysql優化器失效。你以為問題就這麼結束了嗎,no,當我們將a1索引刪除 建立a2索引發現 查詢還是不理想,後面定位sql發現查詢語句sql會變,也就是如果我們聯合索引(列1 列2 列3) 而列1 後端程式會根據不同的條件時而不傳 時而傳,這種查詢條件應該經常遇到,我們也做了一次 驗證

場景一:我們建立聯合索引a3( a_id ,serial_number,a_task_id),但是我們查詢條件 where   a_id='401500000007' and  serial_number='1042503619011674112' 兩個條件根據前導列查詢原則,mysql和oracle查詢均走a3索引

mysql查詢結果

oracle查詢結果:

場景二:我們還是建立聯合索引a3( a_id ,serial_number,a_task_id),但是我們查詢條件  where   serial_number='1042503619011674112' and a_task_id='401500000007' 查詢沒有前導列 兩者結果如何呢

mysql查詢結果

oracle查詢結果

結論:如果聯合索引查詢條件沒有前導列都會導致資料庫不走索引,而只要保證前導列存在 不管順序如何都會走索引,後面根據優化結果 如果前端確實不想傳改條件 我們重新根據業務條件 將開聯合索引拆分建立兩個聯合索引 問題得到完美解決

總結:在oracle轉mysql的過程中不僅要改造sql語法 想對應的索引優化也需要根據不同的優化器去優化,oracle和mysql底層設計有很多不同,特別是針對索引這塊,程式開發指令碼編寫以及優化都需要小心再小心

我們平時在測試環境由於資料量不夠大 所以建立索引感覺問題不大,但是線上資料量大 建立索引需要結合當時場景 否則不小心索引建立會鎖表 導致線上查詢擁堵

在優化查詢的過程中一定要結合業務 程式做優化 不能脫離各個業務部門,要做好分析,提前做好預演,部門之間要做好銜接

記一次控制項公升級引起的血案 黑色清明

事件起因 清明假期期間接到甲方 說系統 某些 功能訪問異常 事件排查過程 1.首先懷疑是各網點網路異常 有些網點業務正常 建議由網點長ping伺服器 甲方網路故障有前科 經過兩個小時的跟蹤,發現網路正常的情況下也會出現異常 2.排查網路的過程中檢查了資料庫的效能及相關業務的表結構,甲方資料庫隨著業務...

記一次 轉義引發的血案

周五的下午,擼完了 默默的憧憬週末的生活,突然前端告訴我,介面又 了 檢查之後,發現是物件接收時間格式的時候出錯,默默的做了轉換,發現 突然我發現資料庫的字段竟然亂碼了 完成數底於周任務80 扣除月績效20 原本應該是要這樣的,結果百分號全部亂碼了,剛開始還以為前後端之間的字元型別不對,導致文字格式...

一次老闆發話引起的思考

1.員工被重視的感覺是怎樣形成的?一般老闆都希望員工有被重視的感覺,而員工有了這種感覺,也確實可以大大地加強員工的效率和工作的積極性。關鍵是,這種感覺是怎樣形成的呢?其實所謂的被重視的感覺,說白了就是認同感。被肯定,就是被領導贊同 被公認,就是周圍的同事或者team member能相互賞識和尊重,被...