Mysql性能优化这5点你知道吗?简单却容易被初学者忽略!
Mysql性能優(yōu)化這5點你知道嗎?簡單卻容易被初學者忽略!
文編|JavaBuild
哈嘍,大家好呀!我是JavaBuild,以后可以喊我鳥哥,嘿嘿!俺滴座右銘是不在沉默中爆發(fā),就在沉默中滅亡,一起加油學習,珍惜現(xiàn)在來之不易的學習時光,等工作之后,你就會發(fā)現(xiàn),想學習真的需要擠時間,厚積薄發(fā)啦!
在日常工作中,我們常用的數(shù)據庫無非是Mysql、Oracle、SqlServer、DB2這幾種(僅針對關系型數(shù)據庫中),對于我們來說,數(shù)據庫的性能優(yōu)化是一個重點問題,也是很多公司面試時喜歡提及的,這里總結了一些比較常見,但又相對容易忽略的部分,供大家批判學習。
1、切勿使用select * 進行全表查詢
select * 會直接查詢出數(shù)據表中的全量字段數(shù)據,可能很多數(shù)據并不需要,白白浪費了數(shù)據庫資源,并且select * 不會走覆蓋索引,可能會出現(xiàn)回表操作,在單表數(shù)據量較大情況下,導致sql查詢的效率低下。
2、盡量用union all 替代union
union組合查詢,可以不獲取幾張表排重后的數(shù)據結果。
union all 是用來獲取幾張表的全量數(shù)據,不會排重,包含重復數(shù)據。
在union排重的過程中,需要遍歷、排序和比較,耗時耗資源。所以,若非一些不可有重復數(shù)據的業(yè)務場景外,盡量選擇union all。
3、小表驅動大表
何為小表驅動大表?顧名思義,兩多表聯(lián)合查詢時,用數(shù)據量小的表去驅動數(shù)據量大的數(shù)據表,譬如:有user和order兩張表,order表為100萬數(shù)據量,user表有100條數(shù)據,此時想查一下有效用戶下過的訂單情況。
有如下兩種實現(xiàn)方式:
這兩種方式,其實使用in查詢的效果更好,因為,執(zhí)行順序是先執(zhí)行in中子查詢,然后再執(zhí)行外面的雨具,此時in中數(shù)據量少,查詢速度快。
當使用exists時,會優(yōu)先查詢左側的主查詢,然后將查詢出的結果和右邊的語句進行匹配,用100萬條數(shù)據與100條數(shù)據匹配結果,顯然效率會查很多。
這種做一個小總結:
1:in關鍵字適應于左邊大表,右邊小表;
2:exists關鍵字適應于左側小表,右邊大表;
后面我們還會提及的join連接查詢,也同樣是遵循小表驅動大表規(guī)則。
4、用連接查詢代替子查詢
在Mysql中,如果想通過多張表查詢數(shù)據,一般會使用子查詢或者連接查詢的方式進行處理(在Mysql8.0之后支持與Oracle相同的WITH AS語法進行數(shù)據分塊處理 )
通過in關鍵字實現(xiàn)的子查詢方式,需要先查詢出內層語句的結果,作為外層語句的過濾條件使用,在這個過程中子查詢會被創(chuàng)建為臨時表,查詢結束后,刪除這些臨時表,如果幾百上千行的sql中頻繁使用的話,會多一些性能損耗。
這時候可以考慮通過連接查詢,但是!在《阿里巴巴開發(fā)者手冊》中對于join的使用數(shù)量限制在了3個,當一段sql中頻繁使用join的話,會帶來索引選擇的困難,曾經在工作中,使用一個數(shù)據量較大的表進行了6次的left join 最終查詢耗時很久。
這里建議大家可以采用多種方式混合使用的方式,先用with as 將核心數(shù)據進行一次處理,隨后在通過 join進行聯(lián)接查詢,匯總結果。
5、建表時選擇合適字段
- 能用數(shù)字類型,就不用字符串,字符的處理要比數(shù)字慢
- 滿足使用情況下,用小類型,比如bit用來存布爾值,tinyint存枚舉值
- 長度固定的字符串字段,用char類型
- 長度可變字符串用varchar類型
- 金額字段用decimal,避免精度丟失
總結
以上是生活随笔為你收集整理的Mysql性能优化这5点你知道吗?简单却容易被初学者忽略!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 聊聊ChatGLM-6B的源码分析
- 下一篇: java生成企业公章图片源代码