MySQL性能優化步驟

一、SQL語句優化

1、優化count

每次分頁操作都要獲取一次count(),都需要掃描大量的行(意味着需要訪問大量的數據)才能獲得精確的結果,因此可以增加彙總表,或者redis緩存來專門記錄該表對應的記錄數,這樣的話,就可以很輕鬆的實現彙總數據的查詢,而且效率很高,但是這種統計並不能保證百分之百的準確。

創建一張表用來記錄日誌表的總數據量:

create table log_counter(
logcount bigint not null
)

在每次插入數據之後,更新該表 :

<update id="updateLogCounter" >
update log_counter set logcount = logcount + 1
</update>

在進行分頁查詢時, 獲取總記錄數,從該表中查詢既可:

<select id="countLogFromCounter" resultType="long">
select logcount from log_counter limit 1
</select>

2、優化limit

查詢越靠後的頁碼,查詢效率則越慢:

select * from operation_log 1 limit 3000000 , 10;

將上述SQL優化爲 :

select * from operation_log t , (select id from operation_log order by id limit
3000000,10) b where t.id = b.id ;

3、條件查詢優化

針對於條件查詢,需要對查詢條件,及排序字段建立索引。
在這裏插入圖片描述

create index idx_id_username_roleid on t_user(id,username,role_id);
create index idx_username_roleid on t_user(username,role_id);
create index idx_roleid on t_user(role_id);

使用explain語句查看優化效果:
在這裏插入圖片描述
在這裏插入圖片描述
可以看到無論哪種組合查詢都走了索引,查詢效率明顯提升。

4、優化排序

在查詢數據時,如果業務需求中需要我們對結果內容進行了排序處理 , 這個時候,我們還需要對排序的字段建立適當的索引, 來提高排序的效率 。

二、服務器優化

1、MySQL主從複製和讀寫分離

服務器主從複製是指將主數據庫的DDL 和 DML 操作通過二進制日誌傳到從庫服務器中,然後在從庫上對這些日誌重新執行,從而使得從庫和主庫的數據保持同步。在Mysql主從複製的基礎上,可以使用讀寫分離來降低單臺Mysql節點的壓力,從而來提高訪問效率,對於讀寫分離的實現,可以通過Spring AOP 來進行動態的切換數據源。

2、應用服務器優化

(1)緩存:可以在業務系統中使用redis來做緩存,緩存一些基礎性的數據,來降低關係型數據庫的壓力,提高訪問效率。

(2)全文檢索:如果業務系統中的數據量比較大(達到千萬級別),這個時候,如果再對數據庫進行查詢,特別是進行分頁查詢,速度將變得很慢(因爲在分頁時首先需要count求合計數),爲了提高訪問效率,這個時候,可以考慮加入Solr 或者 ElasticSearch全文檢索服務,來提高訪問效率。

(3)非關係型數據庫:也可以考慮將非核心(重要)數據,存在 MongoDB 中,這樣可以提高插入以及查詢的效率。


注:聯合索引的結構

在這裏插入圖片描述

create index idx_id_username_roleid on t_user(id,username,role_id);

B+樹排序時先比較id,再比較username,最後比較role_id.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章