mysql 優化 資料型別不匹配導致的全表掃瞄

2021-10-21 11:05:59 字數 1105 閱讀 3744

一條sql執行時間特別長,很多時候頁面都直接504 timeout,sql內容大致如下,其中a表的資料有2000w+資料,b表有600w+資料

select

a.*from

awhere

a.user_id =

123and a.id notin(

select

b.pay_record_id as pay_record_id

from

bwhere

b.user_id =

456)

order

by create_time desc

;

本來這2條sql語句裡面都是有索引的,所以查詢速度應該是很快的,但是實際上慢到直接超時,有點不解。

於是把每條sql都單獨執行一下,發現速度很快,但是放到一起就很慢,於是就知道問題出在了2個表的關聯條件上了。

於是檢視了 a表的id的字段型別為 int,而b表中pay_record_id是bigint。這就找到原因了,a表和b表的字段型別不匹配,所以導致了a表的全表掃瞄。所以超時!

解決辦法就是為b表的字段進行型別轉換 ,讓它跟a表的字段型別一致,修改後sql如下:

select

a.*from

awhere

a.user_id =

123and a.id notin(

select

-- 把 bigint 轉換為 int

cast(b.pay_record_idas signed)

as pay_record_id

from

bwhere

b.user_id =

456)

order

by create_time desc

;

執行一下發現執行時間從超時變成2-3秒,完美解決問題。

解決思路:

單獨分析每一條sql執行時間,如果有特別慢的sql那麼先優化單獨的sql,如果單獨執行sql速度很快,那麼問題就應該出現在表管理的條件上,表關聯條件慢一般就是資料型別不匹配:包括 int 跟 bigint不匹配,varchar的字符集不匹配都可能導致全表掃瞄。

IOS swift資料型別不匹配問題

swift的資料運算使用起來感覺比oc要嚴格,oc有時候即使型別不同也可以直接運算,swift則會報錯.例如 let circleview y self.view.center.y cgfloat screen width 0.1 oc screen width 0.1這裡是不用強轉型別的 又如 c...

MySQL資料型別優化

mysql資料型別眾多,選擇正確的資料型別對於獲得高效能至關重要。遵從以下幾條原則有助力做出更好的選擇。1 更小的資料型別。更小的資料型別通常更快,因為它們占用更少的磁碟 記憶體和cpu快取,並且處理時需要的cpu週期也更少。但也要確保自己沒有低估需要的儲存範圍。2 簡單的資料型別。簡單的資料型別通...

MYSQL資料型別優化

mysql支援的資料型別很多,選擇正確的資料型別對於獲得高效能至關重要,不管儲存哪種資料型別,下面幾個簡單原則都有助於我們做出更好的選擇。1 更小的通常更好,更小的資料型別通常更快,因為它們占用更少的磁碟,記憶體和cpu快取,並且處理時需要的cpu週期也更少。但是要確保不會低估要儲存值的範圍 2 簡...