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


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

一、總結

一句話總結:

原理是用子查詢優化join連表查詢(lavarel的模型操作喜歡這么干)(因為連表數據臃腫,再進行條件查詢和分組就太吃虧了),這這里的效率提升了1000倍
這里提升效率是先用子查詢進行了條件查詢,這樣再連表花費就沒有那么大了
多表內聯表后數據就變得臃腫了,這時候再進行條件查詢和分組就太吃虧了,於是我們可以先對單表進行條件處理,再進行連表查詢,只不過這個方案只是用了子查詢而沒有內聯查詢了,而兩者效率對比之下,有內聯的方案帶其他查詢條件的效率更高。

 

1、查看sql語句的執行效率?

mysql中查看sqp語句具體的執行效率就用explain

 

2、連表操作如何優化?

可以先用子查詢 將條件數據篩選出來,然后再進行連表操作,這樣會比先連表后找符合條件的數據效率要高很多倍

 

 

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

轉自或參考:MYSQL一次千萬級連表查詢優化(一)
https://blog.csdn.net/insis_mo/article/details/82897665

概述:

這個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了解一下情況:
這里寫圖片描述

總結:

其實這個優化方案跟我上一篇文章解決原理一樣,都是解決了內聯表后數據就變得臃腫了,這時候再進行條件查詢和分組就太吃虧了,於是我們可以先對單表進行條件處理,再進行連表查詢,只不過這個方案只是用了子查詢而沒有內聯查詢了,而兩者效率對比之下,有內聯的方案帶其他查詢條件的效率更高。

--------------------- 本文來自 Tim_PHPer 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/Tim_phper/article/details/78357016?utm_source=copy

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM