MYSQL一次千萬級連表查詢優化

2021-09-20 01:29:19 字數 2087 閱讀 1270

交代一下背景,這算是一次專案經驗吧,屬於公司乙個已上線平台的功能,這算是離職人員挖下的坑,隨著資料越來越多,原本的sql查詢變得越來越慢,使用者體驗特別差,因此sql優化任務交到了我手上。 

這個sql查詢關聯兩個資料表,乙個是攻擊ip使用者表主要是記錄ip的資訊,如第一次攻擊時間,位址,ip等等,乙個是ip攻擊次數表主要是記錄每天ip攻擊次數。而需求是獲取某天攻擊ip資訊和次數。(以下sql語句測試均在測試伺服器上上,正式伺服器的效能好,查詢時間快不少。)

檢視表的行數: 

未優化前sql語句為:

select

attack_ip,

country,

province,

city,

line,

info_update_time as attack_time,

sum( attack_count ) as attack_times

from

`blacklist_attack_ip`

inner

join

`blacklist_ip_count_date`

on`blacklist_attack_ip`.`attack_ip` = `blacklist_ip_count_date`.`ip`

where

`attack_count` > 0

and`date` between '2017-10-13 00:00:00'

and'2017-10-13 23:59:59'

group

by`ip`

limit 10 offset 1000

先explain分析一下: 

這裡看到索引是有的,但是ip攻擊次數表blacklist_ip_count_data也用上了臨時表。那麼這sql不優化直接第一次執行需要多久(這裡強調第一次是因為mysql帶有快取功能,執行過一次的同樣sql,第二次會快很多。) 

實際查詢時間為300+秒,這完全不能接受呀,這還是沒有其他搜尋條件下的。 

那麼我們怎麼優化呢,這裡用的是內聯表查詢,大家都是知道子查詢完全是可以代替內聯表查詢的,只不過sql語句複雜了不少,那麼我們分析一下這sql,兩個表分表提供了什麼? 

1、ip攻擊次數表blacklist_ip_count_data主要提供的指定時間條件查詢,攻擊次數條件查詢後的ip和每個ip符合條件下的具體攻擊次數。 

2、攻擊ip使用者表blacklist_attack_ip主要是具體ip的資訊,如第一次攻擊時間,位址,ip等等。 

那麼我們一步步來: 

1、ip攻擊次數表blacklist_ip_count_data獲取符合時間條件和攻擊次數的ip並且以ip分組: 

2、攻擊ip使用者表blacklist_attack_ip指定具體的ip獲取資訊: 

然後結合在一起: 

可見,取出來的資料完全一模一樣,可是優化後效率從原來的330秒變成了0.28秒,這裡足足提公升了1000多倍的速度。這也基本滿足了我們的優化需求。 

我們explain了解一下情況: 

MYSQL一次千萬級連表查詢優化(二)

概述 交代一下背景,這算是一次專案經驗吧,屬於公司乙個已上線平台的功能,這算是離職人員挖下的坑,隨著資料越來越多,原本的sql查詢變得越來越慢,使用者體驗特別差,因此sql優化任務交到了我手上。這個sql查詢關聯兩個資料表,乙個是攻擊ip使用者表主要是記錄ip的資訊,如第一次攻擊時間,位址,ip等等...

30個mysql千萬級大資料SQL查詢優化技巧詳解

1.對查詢進行優化,應盡量避免全表掃瞄,首先應考慮在 where 及 order by 涉及的列上建立索引。2.應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃瞄,如 select id from t where num is null可以在num...

MYSQL一次調優經驗

前言 這是最近剛發生在公司的一次應用系統的mysql調優過程,事情的過程是這樣的 公司的乙個銷售系統,用的是mysql資料庫,在元旦的前夕突然就宕機了。差不多導致業務系統4個小時左右使用有問題 因為這個系統乙方公司尚未完全交付,所以資料庫的運維的工作,作為甲方也還未交接到我的手上,這個事情也是元旦過...