MySQL數(shù)據(jù)庫優(yōu)化漫談
點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號”
優(yōu)質(zhì)文章,第一時間送達(dá)
1.表設(shè)計
遵循三范式,但必要的時候做數(shù)據(jù)冗余,舉例說明:在權(quán)限模型中可能會用到5張表 用戶表、角色表、權(quán)限表,還有用戶角色關(guān)聯(lián)表和角色權(quán)限關(guān)聯(lián)表。如果此時要通過用戶查詢權(quán)限則必須關(guān)聯(lián)查詢或者使用多條sql查詢,此時可以在用戶表增加一個字段來存儲用戶的權(quán)限(例如將權(quán)限值使用逗號隔開),這樣可以如果查詢某用戶的權(quán)限可以直接在用戶表中查詢,查詢后再用程序來處理。
2.分表技術(shù)
橫向分表(各個表的字段類型與數(shù)量是完全一致的),例如用戶表,可以按用戶首字母橫向切分;交易記錄可以按照年份或者月份切分,每張表的字段一致,至于按什么規(guī)則來來區(qū)分可以看具體的業(yè)務(wù)。
縱向分表(各個表的字段不一致,但條數(shù)是一致的),例如某商城網(wǎng)站用戶表使用MyISAM引擎,可以應(yīng)對用戶登錄時的查詢操作,但是用戶之間轉(zhuǎn)賬需要事務(wù)來保證安全,這樣就可以將用戶余額字段分離出來組成一張InnoDB引擎的新表,和用戶表關(guān)聯(lián),既滿足高效查詢,又滿足穩(wěn)定性。
另外還可以進(jìn)行分區(qū),或者分庫,都是類似的思路。
3.索引優(yōu)化
常見的索引有 主鍵索引、唯一索引、普通索引、全文索引(僅MyISAM存儲引擎支持,并且不支持中文,如果需要支持中文需要安裝插件)。通常需要在條件字段、排序字段、分組字段以及關(guān)聯(lián)字段上建立對應(yīng)索引。但重復(fù)率很高的字段不宜建立索引,比如狀態(tài)字段(是否被刪除,是否上架等),emum類型(性別等),另外建立索引會對增刪改操作的速度有影響,因此頻繁更新的字段不適合建立索引,例如文章的點(diǎn)擊量。
4.SQL優(yōu)化
在開發(fā)時可以使用explain 測試sql語句
在測試結(jié)果會有如下參數(shù),簡要解釋一下
select_type
查詢的方式 SIMPLE表示select類型,沒有連接或者子查詢,PRIMARY表示主查詢(注意:不是主鍵,例如子查詢時的外層查詢,UNION查詢時的第一個select),DEPENDENT SUBQUERY表示子查詢語句,UNION表示UNION查詢時除了PRIMARY(第一條語句)之外的語句
table 表名
type 掃描類型(重要)如果是All表示全表掃描,效率低;如果是const表示最多有一行與結(jié)果匹配,效率高;system表示表中僅有一條數(shù)據(jù),肯定高效;eq_ref表示所以用到主鍵或者唯一索引;ref表示用到普通索引;range表示查詢一個區(qū)間(范圍的數(shù)據(jù));index表示都是通過索引查詢性能一般
possible_keys 可能使用到的索引(重要)
key 實(shí)際用到的索引(重要)
key_len 索引長度
ref
rows MySQL認(rèn)為它執(zhí)行查詢時必須檢查的行數(shù)(重要)越小越好
Extra 額外信息 Using filesort表示查詢中使用了order by 并且無法利用索引排序,如果確實(shí)不需要排序可以在SQL語句末尾增加order by null.Using temporary某些操作使用了臨時表,不要.Using where 使用索引.
對于已經(jīng)上線的項(xiàng)目可以開啟MySQL的慢查詢來定位低效率的SQL,見使用MySQL的慢查詢?nèi)罩菊业降托У腟QL語句并通過explain分析進(jìn)行優(yōu)化
使用如下命令
show global status like 'Com%';
show global status like 'InnoDB_rows%';
show variables like 'long_query_time';
show variables like '%slow%';
使用optimize table 表名;命令來優(yōu)化表,執(zhí)行時會占用大量資源,所以建議在用戶訪問量少的時刻執(zhí)行。
5.配置優(yōu)化
該值可以通過使用SHOW STATUS LIKE 'Qcache%';命令來查看MySQL狀態(tài)來進(jìn)行相應(yīng)的更改,如果Qcache_lowmem_prunes的值非常大,則表明經(jīng)常出現(xiàn)緩沖不夠的情況需要增加cache值;如果Qcache_hits的值非常大,則表明查詢緩沖使用非常頻繁,是理想狀態(tài),如果該值較小反而會影響效率,那么可以考慮不用查詢緩沖。
對于MyISAM設(shè)置
key_buffer_size = 32M
MyISAM表會使用操作系統(tǒng)的緩存來緩存數(shù)據(jù),設(shè)置的值取決于系統(tǒng)內(nèi)存、索引大小、數(shù)據(jù)量以及負(fù)載。
對于InnoDB設(shè)置
innodb_buffer_pool_size = 2.4G
可以設(shè)置內(nèi)存的70%左右,當(dāng)然要考慮內(nèi)存的整體占用情況。
版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。
本文鏈接:
https://blog.csdn.net/xiaowuc/article/details/11988753


