日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

mysql監(jiān)控、性能調(diào)優(yōu)及三范式理解

系統(tǒng) 2031 0

1監(jiān)控

???????? ?工具: sp on mysql???? ?sp系列可監(jiān)控各種數(shù)據(jù)庫

?

2調(diào)優(yōu)

2.1 DB層操作與調(diào)優(yōu)

????????????? ?2.1.1、開啟慢查詢

??????????????????????????? ?在 My.cnf文件中添加如下內(nèi)容(如果不知道 my.cnf的路徑可使用 find / -name my.cnf進(jìn)行查找):

??????????????????????????? ?在 mysqld下添加

??????????????????????????? ?Log_slow_queries = ON? ?作用:開啟慢查詢服務(wù)

??????????????????????????? ?Log-slow-queries = /var/log/slowqueries.log ?作用:慢查詢?nèi)罩敬鎯β窂健?

??????????????????????????? ?Long_query_time = 1 ?作用:定義慢查詢時(shí)間長度,默認(rèn)為 10

??????????????????????????? ?添加以上內(nèi)容后使用 service mysqld restart ?重啟 mysql服務(wù)

??????????????????????????? ?重啟后使用 ?show variables like ‘%slow%’查看慢查詢開啟狀態(tài)

??????????????????????????? ?如 slow_query_log ?和 ?log_slow_queries ?兩個(gè)字段的值都顯示為 ON,那么說明慢查詢開啟成功。

????????????? ?2.1.2、 mysqldumpslow分析慢查詢。

? ? ? ? ? ? ? ? ? ?切換到慢查詢存儲路徑下 ?cd /var/log ?使用 ?ll ?命令查看文件,如果 slowqueries.log ?的文件的大小變大,有內(nèi)容說明已經(jīng)捕捉到慢查詢語句,或者使用 cat ?、 more ?、 less ?、 vi ?等命令進(jìn)入文件內(nèi)部進(jìn)行查看,有內(nèi)容說明捕捉到慢查詢。

Mysqldumpslow ?分析慢查詢?nèi)罩?

?????????????????????????????????????????????? ?參數(shù)說明:

??????????????????????????????????????????????????????? ?-s ?排序方式 ?c,t,l,r ?四個(gè)參數(shù)分別表示記錄次數(shù)、時(shí)間、查詢時(shí)間的多少和返回記錄次數(shù)排序。

??????????????????????????????????????????????????????? ?-t ?返回前面多少條數(shù)據(jù)

??????????????????????????????????????????????????????? ?-g ?正則表達(dá)式匹配日志內(nèi)容

?

????????????? ?2.1.3、 explain執(zhí)行計(jì)劃進(jìn)行 sql語句分析

???????????????????????????????????? ?Explain分析捕捉到的 select語句

???????????????????????????????????? ?用法: explain ?后邊直接加 select ?語句。

?????????????????????????????????????????????? ?重點(diǎn): type列

?????????????????????????????????????????????? ?指標(biāo)說明:(從左到右,性能由差到好)

???????????????????????????????????????????????????????????????? ?All,index ,range,ref,,eq_ref,const or system ,null

?????????????????????????????????????????????? ?重點(diǎn): extra

?????????????????????????????????????????????? ?指標(biāo)說明:

???????????????????????????????????????????????????????????????? ?Only index ?使用到了索引

???????????????????????????????????????????????????????????????? ?Where used ?使用到了 where限制

???????????????????????????????????????????????????????????????? ?Using filesort ?使用了全文排序

???????????????????????????????????????????????????????????????? ?Using temporary ?使用到了臨時(shí)表

?????????????????????????????????????????????? ?當(dāng) extra里顯示有 using filesort ?或 ?using temporary ?時(shí), sql的執(zhí)行就會很吃力,時(shí)間就會增加。

?

????????????? ?2.1.4、分析后調(diào)優(yōu),優(yōu)化索引

???????????????????????????????????? ?根據(jù)每個(gè) sql語句的表現(xiàn)不同,在相應(yīng)的字段上加索引

???????????????????????????????????? ?索引一般加在 sql語句中的 where字句相關(guān)的字段上。

?

2.2Cache層的操作與調(diào)優(yōu)

2.2.1開啟 query cache

my.cnf里 mysqld下添加:

???????????????????????????? ?Query_cache_size = 268435456

使用的內(nèi)存大小, ?這個(gè)值必須是 1024的整數(shù)倍

???????????????????????????? ?Query_cache_type = 1

???????????????????????????? ?此字段值可以 0,1,2 ?三個(gè)值

???????????????????????????? ?0,代表關(guān)閉

???????????????????????????? ?1代表給所有的 select語句做 cache

?????????????????????????????????????? ?當(dāng)語句 select no_no_cache * from A;執(zhí)行時(shí)不做 cache

???????????????????????????? ?2代表開啟 query cache功能,但只有執(zhí)行

??????????????????????????????????????????????? ?語句 select sql_cache * from A; ?時(shí)才做 cache

???????????????????????????? ?Query_cache_limit = 1048576

???????????????????????????? ?單條語句的最大容量限制,超過此容量的 sql語句講不被 cache

?

當(dāng)做 cache時(shí)需注意,只有完全相同的 sql語句才被認(rèn)為是相同的,此時(shí)才能夠從緩存當(dāng)中取數(shù)據(jù),增加 sql執(zhí)行速度。

如果 cache不合理,會導(dǎo)致大量的清緩存,加 cache的動作,不但不會增加 sql執(zhí)行速度,反而會降低效率。如:當(dāng)某表中有大量的插入,刪除,修改等操作時(shí),就不適合做 cache。

?

2.2.2query cache ?運(yùn)行狀態(tài)分析

show status like ‘%qcache%’

??????????????????? ?qcache_free_blocks:數(shù)目大說明有碎片

??????????????????? ?qcache_free_memory:緩存中的空閑內(nèi)存

??????????????????? ?qcache_hits:命中次數(shù),每次查詢在緩存中命中就增加

??????????????????? ?qcache_inserts:緩存中插入查詢次數(shù),每次插入就增加

??????????????????? ?qcache_lowmem_prunes:這個(gè)數(shù)字增長,表明碎片多或內(nèi)存少

??????????????????? ?qcache_total_blocks:緩存中塊的總數(shù)量

2.2.3計(jì)算

    Query_cache命中率 =query_hits/(qcache_hits+qcache_inserts)

    緩存碎片率 =qcache_free_blocks/qcache_total_blocks*100%

??????????????????? ?碎片率超過 20%時(shí),可用 flush query cache整理緩存碎片

    緩存利用率 =( query_cache_size-qcache_free_memory) /query_cache_size*100%

?

2.2.4 qchche優(yōu)化

???????? 整理所有查詢的 sql,講所有需要返回結(jié)果相同以及查詢方法相同的 sql整理后寫成一模一樣的,或使用 mybatis框架,把所有的 sql寫到配置文件中,使用的時(shí)候調(diào)用。

原因是,只有一模一樣的 sql語句,才會在 cache中取結(jié)果。

?

?

2.3 mysql配置優(yōu)化

2.3.1 back_log

要求 ?MySQL ?能有的連接數(shù)量。當(dāng)主要 MySQL線程在一個(gè)很短時(shí)間內(nèi)得到非常多的連接請求,這就起作用,然后主線程花些時(shí)間 (盡管很短 )檢查連接并且啟動一個(gè)新線程。

back_log ?值指出在 MySQL暫時(shí)停止回答新請求之前的短時(shí)間內(nèi)多少個(gè)請求可以被存在堆棧中。只有如果期望在一個(gè)短時(shí)間內(nèi)有很多連接,你需要增加它,換句話說,這值 ?對到來的 TCP/IP連接的偵聽隊(duì)列的大小。你的操作系統(tǒng)在這個(gè)隊(duì)列大小上有它自己的限制。 ?試圖設(shè)定 back_log高于你的操作系統(tǒng)的限制將是無效的。

當(dāng)你觀察你的主機(jī)進(jìn)程列表,發(fā)現(xiàn)大量 ?264084 | unauthenticated user | xxx.xxx.xxx.xxx | NULL | Connect | NULL | login | NULL ?的待連接進(jìn)程時(shí),就要加大 ?back_log ?的值了。默認(rèn)數(shù)值是 50,我把它改為 500。

2.3.2interactive_timeout

服務(wù)器在關(guān)閉它前在一個(gè)交互連接上等待行動的秒數(shù)。一個(gè)交互的客戶被定義為對 ?mysql_real_connect()使用 ?CLIENT_INTERACTIVE ?選項(xiàng)的客戶。 ?默認(rèn)數(shù)值是 28800,我把它改為 7200。

2.3.3 key_buffer_size

索引塊是緩沖的并且被所有的線程共享。 key_buffer_size是用于索引塊的緩沖區(qū)大小,增加它可得到更好處理的索引 (對所有讀和多重 ?寫 ),到你 ?能負(fù)擔(dān)得起那樣多。如果你使它太大,系統(tǒng)將開始換頁并且真的變慢了。默認(rèn)數(shù)值是 8388600(8M),我的 MySQL主機(jī)有 2GB內(nèi)存,所以我把它改為 ?402649088(400MB)。

2.3.4 max_connections

允許的同時(shí)客戶的數(shù)量。增加該值增加 ?mysqld ?要求的文件描述符的數(shù)量。這個(gè)數(shù)字應(yīng)該增加,否則,你將經(jīng)常看到 ?Too many connections ?錯(cuò)誤。 ?默認(rèn)數(shù)值是 100,我把它改為 1024 ?。

2.3.5 record_buffer

每個(gè)進(jìn)行一個(gè)順序掃描的線程為其掃描的每張表分配這個(gè)大小的一個(gè)緩沖區(qū)。如果你做很多順序掃描,你可能想要增加該值。默認(rèn)數(shù)值是 ?131072(128K),我把它改為 16773120 (16M)

2.3.6 sort_buffer

每個(gè)需要進(jìn)行排序的線程分配該大小的一個(gè)緩沖區(qū)。增加這值加速 ORDER BY或 GROUP BY操作。默認(rèn)數(shù)值是 2097144(2M),我把它改為 ?16777208 (16M)。

2.3.7 table_cache

為所有線程打開表的數(shù)量。增加該值能增加 mysqld要求的文件描述符的數(shù)量。 MySQL對每個(gè)唯一打開的表需要 2個(gè)文件描述符。默認(rèn)數(shù)值是 64, ?我把它改為 512。

2.3.8 thread_cache_size

可以復(fù)用的保存在中的線程的數(shù)量。如果有,新的線程從緩存中取得,當(dāng)斷開連接的時(shí)候如果有空間,客戶的線置在緩存中。如果有很多新的線程,為了提高 ?性能可 ?以這個(gè)變量值。通過比較 ?Connections ?和 ?Threads_created ?狀態(tài)的變量,可以看到這個(gè)變量的作用。我把它設(shè)置為 ?80。

2.3.9 wait_timeout

服務(wù)器在關(guān)閉它之前在一個(gè)連接上等待行動的秒數(shù)。 ?默認(rèn)數(shù)值是 28800,我把它改為 7200。

注:參數(shù)的調(diào)整可以通過修改 ?/etc/my.cnf ?文件并重啟 ?MySQL ?實(shí)現(xiàn)。這是一個(gè)比較謹(jǐn)慎的工作,上面的結(jié)果也僅僅是我的一些看法,你可以根據(jù)你自己主機(jī)的硬件情況 (特別是內(nèi)存大小 )進(jìn)一步修改。

2.4 ?數(shù)據(jù)庫設(shè)計(jì)模型

2.4.1范式設(shè)計(jì)

2.4.1.1 ?一范式

需要保持每一列的原子性

例:電話號碼: 86-010-11111111

如果要符合一范式,那么需要把電話號碼拆分為國家號碼、區(qū)號、電話號碼進(jìn)行存儲,達(dá)到每一列不能夠再拆分。

符合原子性的標(biāo)準(zhǔn)即為一范式

2.4.1.2 ?二范式

首先必須符合一范式。

另外需要滿足,每一個(gè)表必須有主鍵

除主鍵外其他的列必須和主鍵相關(guān),不能只與主鍵的某一個(gè)部分相關(guān)

例如一個(gè)表有一個(gè)聯(lián)合主鍵,而部分?jǐn)?shù)據(jù)是與聯(lián)合主鍵相關(guān)而不與主鍵相關(guān),那么這時(shí)需要把表拆開,使得每一列都與主鍵相關(guān)。

?

2.4.1.3 ?三范式

首先必須符合二范式

另外需要滿足,每一個(gè)非主鍵列必須直接依賴主鍵,而不能存在傳遞依賴。

?

2.4.1.4 ?范式設(shè)計(jì)的優(yōu)點(diǎn)

范式設(shè)計(jì)可以避免數(shù)據(jù)冗余,減少數(shù)據(jù)庫的使用空間,減輕維護(hù)數(shù)據(jù)完整性的麻煩。

2.4.1.5范式設(shè)計(jì)的缺點(diǎn)

?

符合范式設(shè)計(jì)的級別越高,那么拆分出來的表越多,想獲得一個(gè)完整的數(shù)據(jù)的時(shí)候聯(lián)合查詢的時(shí)候所關(guān)聯(lián)的表就越多,直接帶來的問題就是性能的下降。

?

1.2.4.2反范式設(shè)計(jì)

在實(shí)際工作中,對于獲得某些信息過于頻繁時(shí),我們一般采用反范式設(shè)計(jì),這樣就避免了多表的關(guān)鍵查詢,讓數(shù)據(jù)略有冗余,換來的是查詢速度的提高。

mysql監(jiān)控、性能調(diào)優(yōu)及三范式理解


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 武平县| 工布江达县| 安仁县| 怀柔区| 上饶市| 南岸区| 雷波县| 城市| 沿河| 江津市| 遂昌县| 麻阳| 禹州市| 鸡西市| 卓尼县| 仙桃市| 塔城市| 沂南县| 龙里县| 临汾市| 舞阳县| 蕲春县| 陆丰市| 黄龙县| 晋州市| 桐乡市| 新田县| 洛阳市| 阳东县| 遂川县| 漳浦县| 外汇| 时尚| 黄梅县| 武清区| 沙坪坝区| 涿鹿县| 柳江县| 宁晋县| 邵武市| 柞水县|