MYSQL查詢與優化

2021-08-28 10:40:38 字數 1985 閱讀 1723

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

blacklist_attack_ip`

先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 索引與查詢優化

本文介紹一些優化 mysql 索引設計和查詢的建議。在進行優化工作前,請務必了解mysql explain命令 檢視執行計畫 索引在邏輯上是指從索引列 關鍵字 到資料的對映,通過索引可以快速的由關鍵字查詢到資料記錄。順序查詢複雜度為o n 樹狀索引查詢複雜度為o logn 雜湊索引為o 1 mysq...

MySQL查詢分析與優化

mysql查詢分析與優化 show www.2cto.com show status 顯示狀態資訊 擴充套件show status like show variables 顯示系統變數 擴充套件show variables like show engine innodb status 顯示innod...

查詢優化(MySQL優化查詢)

關聯查詢太多join 設計缺陷或不得已的需求 資料庫伺服器調優及各個引數設定不適當 緩衝 執行緒數等 慢查詢日誌 找出執行速度慢的sql語句 慢查詢的開啟並捕獲 explain 慢sql分析 show profile查詢sql在mysql伺服器裡面的執行細節和生命週期情況 sql資料庫伺服器的引數調...