查询性能优化(使用 Explain 进行分析、优化数据访问、重构查询方式)、存储引擎(InnoDB/MyISAM)
生活随笔
收集整理的這篇文章主要介紹了
查询性能优化(使用 Explain 进行分析、优化数据访问、重构查询方式)、存储引擎(InnoDB/MyISAM)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1.查詢性能優(yōu)化
1.1 使用 Explain 進(jìn)行分析
Explain 用來分析 SELECT 查詢語句,開發(fā)人員可以通過分析 Explain 結(jié)果來優(yōu)化查詢語句。
比較重要的字段有:
- select_type : 查詢類型,有簡單查詢、聯(lián)合查詢、子查詢等
- key : 使用的索引
- rows : 掃描的行數(shù)
1.2 優(yōu)化數(shù)據(jù)訪問
1.2.1 減少請(qǐng)求的數(shù)據(jù)量
- 只返回必要的列:最好不要使用 SELECT * 語句。
- 只返回必要的行:使用 LIMIT 語句來限制返回的數(shù)據(jù)。
- 緩存重復(fù)查詢的數(shù)據(jù):使用緩存可以避免在數(shù)據(jù)庫中進(jìn)行查詢,特別在要查詢的數(shù)據(jù)經(jīng)常被重復(fù)查詢時(shí),緩存帶來的查詢性能提升將會(huì)是非常明顯的。
1.2.2 減少服務(wù)器端掃描的行數(shù)
最有效的方式是使用索引來覆蓋查詢。
1.3 重構(gòu)查詢方式
1.3.1 切分大查詢
一個(gè)大查詢如果一次性執(zhí)行的話,可能一次鎖住很多數(shù)據(jù)、占滿整個(gè)事務(wù)日志、耗盡系統(tǒng)資源、阻塞很多小的但重要的查詢。
1.3.2 分解大連接查詢
將一個(gè)大連接查詢分解成對(duì)每一個(gè)表進(jìn)行一次單表查詢,然后將結(jié)果在應(yīng)用程序中進(jìn)行關(guān)聯(lián),這樣做的好處有:
- 讓緩存更高效。對(duì)于連接查詢,如果其中一個(gè)表發(fā)生變化,那么整個(gè)查詢緩存就無法使用。而分解后的多個(gè)查詢,即使其中一個(gè)表發(fā)生變化,對(duì)其它表的查詢緩存依然可以使用。
- 分解成多個(gè)單表查詢,這些單表查詢的緩存結(jié)果更可能被其它查詢使用到,從而減少冗余記錄的查詢。減少鎖競爭;
- 在應(yīng)用層進(jìn)行連接,可以更容易對(duì)數(shù)據(jù)庫進(jìn)行拆分,從而更容易做到高性能和可伸縮。
- 查詢本身效率也可能會(huì)有所提升。
例如下面的例子中,使用 IN() 代替連接查詢,可以讓 MySQL 按照 ID 順序進(jìn)行查詢,這可能比隨機(jī)的連接要更高效。
SELECT * FROM tab JOIN tag_post ON tag_post.tag_id=tag.id JOIN post ON tag_post.post_id=post.id WHERE tag.tag='mysql';SELECT * FROM tag WHERE tag='mysql'; SELECT * FROM tag_post WHERE tag_id=1234; SELECT * FROM post WHERE post.id IN (123,456,567,9098,8904);2.存儲(chǔ)引擎
2.1 InnoDB
2.2?MyISAM
2.3 比較
- 事務(wù):InnoDB 是事務(wù)型的,可以使用 Commit 和 Rollback 語句。
- 并發(fā):MyISAM 只支持表級(jí)鎖,而 InnoDB 還支持行級(jí)鎖。
- 外鍵:InnoDB 支持外鍵。
- 備份:InnoDB 支持在線熱備份。
- 崩潰恢復(fù):MyISAM 崩潰后發(fā)生損壞的概率比 InnoDB 高很多,而且恢復(fù)的速度也更慢。
- 其它特性:MyISAM 支持壓縮表和空間數(shù)據(jù)索引
?
總結(jié)
以上是生活随笔為你收集整理的查询性能优化(使用 Explain 进行分析、优化数据访问、重构查询方式)、存储引擎(InnoDB/MyISAM)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL索引(B+Tree 索引、哈希
- 下一篇: 数据类型(整型、浮点数、字符串、时间和日