阿里雲反饋的慢SQL,執行計划返回如下:Impossible WHERE noticed after reading const tables
sql很簡單:
SELECT * FROM deposit_transaction WHERE request_Id = 'XXX'
而且該表的request_id創建了唯一索引:很明顯,這個字段是保持冪等操作的,通過數據庫的唯一索引實現;
每次數據落地前,都要執行該SQL查詢是否記錄存在,而數據庫做冪等兜底;
如果request_id不存在,竟然沒有走request_id的唯一索引....
問題是:
基本99.99%的查詢,肯定數據庫不存在呀!
可是,mysql的innoDB引擎,主鍵查詢或者唯一性索引查詢,如果這條數據沒有的話,它會
全表掃描,然后得出一個結論,該數據不在表中。
對於高並發的庫來說,這條數據,會讓負載特別的高。
所以:
高並發系統,建議通過緩存做冪等校驗,數據庫唯一索引兜底!或者直接通過數據庫的唯一索引兜底!
普通系統,並發小,數據量又不大,那就查詢一把唄,IO高,可是不影響嘛!!!