當(dāng)前位置:首頁 > 新聞中心 > 常見問題
Mysql數(shù)據(jù)庫優(yōu)化,提升產(chǎn)品性能責(zé)任編輯 :李飛    文章來源 :星翼創(chuàng)想(16qt59sf.cn)    發(fā)布時間 :2016-05-13    閱讀次數(shù):4458

正常情況下,初創(chuàng)公司的流量并不是很大,mysql數(shù)據(jù)庫在未做優(yōu)化的情況依然可以滿足性能要求,特別是5.6版本后mysql在性能上還是有了很大提升,所以在初期并沒有花精力在此上面。但后來發(fā)生的一系列問題還是說明mysql性能優(yōu)化在項(xiàng)目啟動時就應(yīng)該重視起來。下面就出現(xiàn)問題的原因和需要注意的地方說明如下:

Mysql

Mysql問題來源

開發(fā)人員之前多數(shù)使用oracle,由于oracle強(qiáng)大的性能和所做項(xiàng)目多是內(nèi)部企業(yè)應(yīng)用,不太可能出現(xiàn)性能問題。在這樣的背景下,開發(fā)人員依然按照原來的方式來寫代碼,導(dǎo)致后來性能問題,總結(jié)有以下幾點(diǎn):

1.sql多表聯(lián)合查詢,常常是3,4張表聯(lián)合查詢

2.sql中使用大量函數(shù)

3.sql中直接select *

4.表字段缺少索引或者索引方式不對

5.表設(shè)計(jì)考慮不周,出現(xiàn)大量空字段

6.表主鍵設(shè)計(jì)成UUID,由于使用傳統(tǒng)機(jī)械硬盤,對尋址非常不利

7.過多使用觸發(fā)器

8.sql中存在復(fù)雜計(jì)算

Mysql性能優(yōu)化決方案

首先通過慢日志過濾出大于1s的sql語句,解決mysql性能問題,一定要利用好慢日志。然后通過執(zhí)行計(jì)劃(explain)來查看sql的執(zhí)行情況。具體優(yōu)化措施如下:

聯(lián)合查詢分拆成單表查詢

如果此sql是聯(lián)合查詢,首先確認(rèn)是否是可以拆分成單表查詢,然后通過程序來進(jìn)行處理數(shù)據(jù)。最多不能超過兩表聯(lián)合查詢。

建立合適索引

通過執(zhí)行計(jì)劃,對全表掃描的查詢一定要建立索引,在建立索引時,一定要考慮到此字段是否有大量空字段,字段值是否大量重復(fù),可區(qū)分度是否高,不然建立索引的意義不大,反而是影響insert 和 delete操作。對于長字符類型的字段,增加算因時,需要增加前綴,計(jì)算方式為:select count(distinct left(b,5)) /count(distinct b) as left5,count(distinct left(b,6))/count(distinct b) as left6 from test_unique limit 1,其中5,6是預(yù)估值,對于UUID這樣長字符類型,一般前綴是6.增加索引時sql語句為:alter table test.test_unique add key (left(6));。 對于不能重復(fù)的字段,建議使用唯一索引,一是保證插入值唯一,二是提高查詢速度 。 在where、order 、group by后面的字段,盡量建立索引,通過需要注意的是如果where后面是多字段,那么需要建立聯(lián)合索引,而不是單個建立索引,并且需要注意聯(lián)合索引的順序,例如where a='x' and b = 'y',在其它sql中出現(xiàn)where b=‘z’這樣的情況,那么聯(lián)合索引順序?yàn)椋╞,a),而不是單獨(dú)建立(a,b)和(b)兩個索引,因?yàn)樵诮⒙?lián)合索引(b,a)時,mysql會建立兩個索引(b),(b,a)兩個索引。

避免索引失效

在字段上使用函數(shù)將會使索引失效,因此一定要避免在左側(cè)字段使用函數(shù),而是提前在程序里處理好。

盡量避免函數(shù)

mysql提供了大量的函數(shù),但對于這些函數(shù),盡量不要用,而是在程序里進(jìn)行處理,目前mysql對于這些函數(shù)優(yōu)化工作做的并不是很好,往往有時候會導(dǎo)致嚴(yán)重的性能問題。

表主鍵使用自增序列

表主鍵盡量采用自增序列,這樣可以充分mysql的存儲特性,mysql采用B+樹存儲。需要注意的地方在于:如果是分庫分表,那么需要不能直接使用自增序列,需要采用其他方法來完成,常用的方式通過redis來維護(hù)一套ID。


文章轉(zhuǎn)載請保留網(wǎng)址:http://16qt59sf.cn/news/faq/1671.html

掃碼添加微信
159 8667 8737
24小時電話

返回頂部