交代一下背景,這算是一次專案經驗吧,屬於公司乙個已上線平台的功能,這算是離職人員挖下的坑,隨著資料越來越多,原本的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個小時左右使用有問題 因為這個系統乙方公司尚未完全交付,所以資料庫的運維的工作,作為甲方也還未交接到我的手上,這個事情也是元旦過...