mysql查詢千萬級數據愈來愈慢優化:mysql
1.分表:(固定某個表存多少數量的數據:例如:一張表存100w的數據量);redis
2.優化sql和創建適合的索引(複合索引);sql
3.使用redis緩存。(redis存一份ID.而後mysql存一份ID每次插入刪除的時候同步便可。查詢的時候只須要從redis裏面找出適合的10個ID,而後到mysql裏面查詢出10條)緩存
記錄便可);優化
4.總數要單獨處理:涉及到總數操做,專門維護一個總數。(例如:新註冊一個會員,總數值加1,須要總數的時候直接拿這個總數,也能夠在這個表上添加了觸發器並建立一個專門用來統計總行數的表spa
添加更新刪除該表就會觸發,分析條件後直接把統計表的相應字段累加,查詢的時候直接讀取統計表中的相應字段就能夠了準確度沒問題,若是有條件查詢分頁,那麼分頁表的數據就發揮不了左右)。線程
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到了百萬級分頁是個極限。
提示:
一、用的myisam仍是innodb,myisam的查詢速度明顯比innodb快不少。
二、能不加where條件的儘可能不加。
三、索引優化
(能夠從業務上進行了優化,規定只查詢指定時間內的數據,或者必定時間內的數據。查詢全部總數數據也能夠使用緩存)