MySQL性能优化步骤
一、SQL語句優(yōu)化
1、優(yōu)化count
每次分頁操作都要獲取一次count(),都需要掃描大量的行(意味著需要訪問大量的數(shù)據(jù))才能獲得精確的結(jié)果,因此可以增加匯總表,或者redis緩存來專門記錄該表對應(yīng)的記錄數(shù),這樣的話,就可以很輕松的實(shí)現(xiàn)匯總數(shù)據(jù)的查詢,而且效率很高,但是這種統(tǒng)計(jì)并不能保證百分之百的準(zhǔn)確。
創(chuàng)建一張表用來記錄日志表的總數(shù)據(jù)量:
create table log_counter( logcount bigint not null )在每次插入數(shù)據(jù)之后,更新該表 :
<update id="updateLogCounter" > update log_counter set logcount = logcount + 1 </update>在進(jìn)行分頁查詢時(shí), 獲取總記錄數(shù),從該表中查詢既可:
<select id="countLogFromCounter" resultType="long"> select logcount from log_counter limit 1 </select>2、優(yōu)化limit
查詢越靠后的頁碼,查詢效率則越慢:
select * from operation_log 1 limit 3000000 , 10;將上述SQL優(yōu)化為 :
select * from operation_log t , (select id from operation_log order by id limit 3000000,10) b where t.id = b.id ;3、條件查詢優(yōu)化
針對于條件查詢,需要對查詢條件,及排序字段建立索引。
使用explain語句查看優(yōu)化效果:
可以看到無論哪種組合查詢都走了索引,查詢效率明顯提升。
4、優(yōu)化排序
在查詢數(shù)據(jù)時(shí),如果業(yè)務(wù)需求中需要我們對結(jié)果內(nèi)容進(jìn)行了排序處理 , 這個(gè)時(shí)候,我們還需要對排序的字段建立適當(dāng)?shù)乃饕? 來提高排序的效率 。
二、服務(wù)器優(yōu)化
1、MySQL主從復(fù)制和讀寫分離
服務(wù)器主從復(fù)制是指將主數(shù)據(jù)庫的DDL 和 DML 操作通過二進(jìn)制日志傳到從庫服務(wù)器中,然后在從庫上對這些日志重新執(zhí)行,從而使得從庫和主庫的數(shù)據(jù)保持同步。在Mysql主從復(fù)制的基礎(chǔ)上,可以使用讀寫分離來降低單臺Mysql節(jié)點(diǎn)的壓力,從而來提高訪問效率,對于讀寫分離的實(shí)現(xiàn),可以通過Spring AOP 來進(jìn)行動(dòng)態(tài)的切換數(shù)據(jù)源。
2、應(yīng)用服務(wù)器優(yōu)化
(1)緩存:可以在業(yè)務(wù)系統(tǒng)中使用redis來做緩存,緩存一些基礎(chǔ)性的數(shù)據(jù),來降低關(guān)系型數(shù)據(jù)庫的壓力,提高訪問效率。
(2)全文檢索:如果業(yè)務(wù)系統(tǒng)中的數(shù)據(jù)量比較大(達(dá)到千萬級別),這個(gè)時(shí)候,如果再對數(shù)據(jù)庫進(jìn)行查詢,特別是進(jìn)行分頁查詢,速度將變得很慢(因?yàn)樵诜猪摃r(shí)首先需要count求合計(jì)數(shù)),為了提高訪問效率,這個(gè)時(shí)候,可以考慮加入Solr 或者 ElasticSearch全文檢索服務(wù),來提高訪問效率。
(3)非關(guān)系型數(shù)據(jù)庫:也可以考慮將非核心(重要)數(shù)據(jù),存在 MongoDB 中,這樣可以提高插入以及查詢的效率。
注:聯(lián)合索引的結(jié)構(gòu)
create index idx_id_username_roleid on t_user(id,username,role_id);B+樹排序時(shí)先比較id,再比較username,最后比較role_id.
總結(jié)
以上是生活随笔為你收集整理的MySQL性能优化步骤的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Arrays常见用法
- 下一篇: 解决Redis超卖问题