Mysql存儲(chǔ)引擎
-
MyISAM
埋酬,不支持事務(wù)、也不支持外鍵烧栋,但其訪問(wèn)速度快写妥,對(duì)事務(wù)完整性沒(méi)有要求。 -
InnoDB
审姓,提供了具有提交珍特、回滾和崩潰恢復(fù)能力的事務(wù)安全。但是比起MyISAM存儲(chǔ)引擎魔吐,InnoDB寫(xiě)的處理效率差一些并且會(huì)占用更多的磁盤空間以保留數(shù)據(jù)和索引扎筒。 -
MEMORY
, 使用存在內(nèi)存中的內(nèi)容來(lái)創(chuàng)建表酬姆。 每個(gè)MEMORY表只實(shí)際對(duì)應(yīng)一個(gè)磁盤文件嗜桌。MEMORY類型的表訪問(wèn)非常得快,因?yàn)樗臄?shù)據(jù)是放在內(nèi)存中的轴踱,并且默認(rèn)使用HASH索引症脂。
表連接的類型
- Left Join
- Right Join
- Inner Join
- Full Join(Do not support)
臨時(shí)表的使用
一旦涉及排序和分組,就很大可能會(huì)使用臨時(shí)表,而臨時(shí)表分兩類:
- 內(nèi)存臨時(shí)表 - MEMORY Engine
- 磁盤臨時(shí)表 - MyISAM Engine
根據(jù)臨時(shí)表的大杏张瘛(tmp_table_size
)壶唤,mysql會(huì)決定使用哪種臨時(shí)表;眾所周知棕所,內(nèi)存的IO速度遠(yuǎn)遠(yuǎn)超過(guò)了磁盤的IO速度闸盔,所以在做優(yōu)化的時(shí)候,盡量避免使用磁盤臨時(shí)表
的情況琳省。
常見(jiàn)優(yōu)化方式
- 先定位慢查詢
show status like ‘slow_queries’;
- 使用
explain
查看SQL的執(zhí)行計(jì)劃迎吵,如果出現(xiàn)Using temporary
的字段,就意味著Query使用了臨時(shí)表针贬,如下圖:
- 對(duì)
Order by
或者Group by
的字段建立索引 - 拆分SQL語(yǔ)句击费,將查詢與排序進(jìn)行分離,為了減少臨時(shí)表的大小桦他,可以先找到符合條件的查詢結(jié)果集蔫巩,然后通過(guò)
IN
或者NOT IN
的方式連接在一起。 - 業(yè)務(wù)變通快压,了解業(yè)務(wù)的真正需求圆仔,比如查詢是否一定要實(shí)時(shí),數(shù)據(jù)是否需要強(qiáng)一致性蔫劣,是否可以
以空間換時(shí)間
的做法解決問(wèn)題坪郭。- 物化視圖,預(yù)先將需要關(guān)聯(lián)或者匯總的數(shù)據(jù)脉幢,通過(guò)實(shí)體表存放起來(lái)歪沃,避免Join查詢
- 增加冗余字段,減少連表查詢
- 增加冗余表嫌松,比如統(tǒng)計(jì)匯總表
- 緩存绸罗, 數(shù)據(jù)庫(kù)緩存或者程序的緩存
- 增加索引
- 應(yīng)用層的優(yōu)化
- 業(yè)務(wù)代碼進(jìn)行結(jié)果集的組裝(排序或者分組),減少數(shù)據(jù)庫(kù)的Join豆瘫。
- 將不變的數(shù)據(jù),從數(shù)據(jù)庫(kù)讀取出來(lái)后菊值,就保存到內(nèi)存中外驱,直接調(diào)用相應(yīng)的靜態(tài)方法或者M(jìn)ap,減少和數(shù)據(jù)庫(kù)的交互次數(shù)腻窒。
- 架構(gòu)層面優(yōu)化
- 讀寫(xiě)分離昵宇,通過(guò)slave節(jié)點(diǎn),分擔(dān)讀的壓力儿子,提高性能(與硬件升級(jí)類似)
- 分庫(kù)分表瓦哎,會(huì)使Join更加復(fù)雜和麻煩(特別是如何保證高效的分布式事務(wù)一致性),不到萬(wàn)不得已,千萬(wàn)別使用蒋譬。
- Join太多割岛,是否意味著這種多表聯(lián)合查詢,放在大數(shù)據(jù)分析里面會(huì)更合適犯助?