分頁查詢千萬級數據慢


mysql查詢千萬級數據越來越慢優化:

1.分表:(固定某個表存多少數量的數據:例如:一張表存100w的數據量);

2.優化sql和建立適合的索引(復合索引);

3.使用redis緩存。(redis存一份ID.然后mysql存一份ID每次插入刪除的時候同步即可。查詢的時候只需要從redis里面找出適合的10個ID,然后到mysql里面查詢出10條)

記錄即可);

4.總數要單獨處理:涉及到總數操作,專門維護一個總數。(例如:新注冊一個會員,總數值加1,需要總數的時候直接拿這個總數,也可以在這個表上添加了觸發器並創建一個專門用來統計總行數的表

添加更新刪除該表就會觸發,分析條件后直接把統計表的相應字段累加,查詢的時候直接讀取統計表中的相應字段就可以了准確度沒問題,如果有條件查詢分頁,那么分頁表的數據就發揮不了左右)。

5.可通過定時任務去批量查詢總數,例如:開啟10個線程去批量計算總數,然后再各自相加即可,不過這樣會導致內存(CPU)過高,而造成內存溢出。

6.修改原有界面內容,單獨去查詢總數,需要即去查詢。也可以用ID建立一定的區間,比如查詢最新的記錄,每次只是查詢2w條的記錄。

    每次只要查最新的一條記錄,id是自增字段,取當前的這個id值就可以大約知道總條數了(注意:項目里並不會刪除參與記錄),但是這種不適合帶條件的查詢。

另外一種查詢條數:

SELECT * FROM table WHERE id BETWEEN 1000000 AND 1000010;

如果需要查詢 id 不是連續的一段,最佳的方法就是先找出 id ,然后用 in 查詢

SELECT * FROM table WHERE id IN(10000, 100000, 1000000...);

使用IN這種基本就是0s級別的。

優化注意事項:

 

1.多個表關聯的時候建議相關聯的表都建立索引。

 

2.在order by 和where語句中的建議建立聯合索引來提升查找速度。

 

3.分頁最好別讓別人看到10萬條以后的數據,要不然會很慢!就算用索引。經過這樣的優化,mysql到了百萬級分頁是個極限。

提示:

1、用的myisam還是innodb,myisam的查詢速度明顯比innodb快很多。

2、能不加where條件的盡量不加。

3、索引優化

(可以從業務上進行了優化,規定只查詢指定時間內的數據,或者一定時間內的數據。查詢所有總數數據也可以使用緩存)

 


免責聲明!

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



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