成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

大牛出招|分分鐘解決MySQL查詢速度慢與性能差

數(shù)據(jù)庫 MySQL
MySQL查詢速度慢、性能差怎么辦?在這里大牛為你出招,分分鐘解決,快來看看吧!

[[256686]]

一、什么影響了數(shù)據(jù)庫查詢速度

1.1 影響數(shù)據(jù)庫查詢速度的四個(gè)因素

 

 

1.2 風(fēng)險(xiǎn)分析

QPS:Queries Per Second意思是“每秒查詢率”,是一臺服務(wù)器每秒能夠相應(yīng)的查詢次數(shù),是對一個(gè)特定的查詢服務(wù)器在規(guī)定時(shí)間內(nèi)所處理流量多少的衡量標(biāo)準(zhǔn)。

TPS:是TransactionsPerSecond的縮寫,也就是事務(wù)數(shù)/秒。它是軟件測試結(jié)果的測量單位。客戶機(jī)在發(fā)送請求時(shí)開始計(jì)時(shí),收到服務(wù)器響應(yīng)后結(jié)束計(jì)時(shí),以此來計(jì)算使用的時(shí)間和完成的事務(wù)個(gè)數(shù)。

Tips:***不要在主庫上數(shù)據(jù)庫備份,大型活動前取消這樣的計(jì)劃。

  • 效率低下的sql:超高的QPS與TPS。
  • 大量的并發(fā):數(shù)據(jù)連接數(shù)被占滿(max_connection默認(rèn)100,一般把連接數(shù)設(shè)置得大一些)。

并發(fā)量:同一時(shí)刻數(shù)據(jù)庫服務(wù)器處理的請求數(shù)量

  • 超高的CPU使用率:CPU資源耗盡出現(xiàn)宕機(jī)。
  • 磁盤IO:磁盤IO性能突然下降、大量消耗磁盤性能的計(jì)劃任務(wù)。解決:更快磁盤設(shè)備、調(diào)整計(jì)劃任務(wù)、做好磁盤維護(hù)。

1.3 網(wǎng)卡流量:如何避免無法連接數(shù)據(jù)庫的情況

  • 減少從服務(wù)器的數(shù)量(從服務(wù)器會從主服務(wù)器復(fù)制日志)
  • 進(jìn)行分級緩存(避免前端大量緩存失效)
  • 避免使用select * 進(jìn)行查詢
  • 分離業(yè)務(wù)網(wǎng)絡(luò)和服務(wù)器網(wǎng)絡(luò)

1.4 大表帶來的問題(重要)

1.4.1 大表的特點(diǎn)

  • 記錄行數(shù)巨大,單表超千萬
  • 表數(shù)據(jù)文件巨大,超過10個(gè)G

1.4.2 大表的危害

1.慢查詢:很難在短時(shí)間內(nèi)過濾出需要的數(shù)據(jù)

查詢字區(qū)分度低 -> 要在大數(shù)據(jù)量的表中篩選出來其中一部分?jǐn)?shù)據(jù)會產(chǎn)生大量的磁盤io -> 降低磁盤效率

2.對DDL影響:

建立索引需要很長時(shí)間:

  • MySQL -v<5.5 建立索引會鎖表
  • MySQL -v>=5.5 建立索引會造成主從延遲(mysql建立索引,先在組上執(zhí)行,再在庫上執(zhí)行)

修改表結(jié)構(gòu)需要長時(shí)間的鎖表:會造成長時(shí)間的主從延遲('480秒延遲')

1.4.3 如何處理數(shù)據(jù)庫上的大表

分庫分表把一張大表分成多個(gè)小表

難點(diǎn):

  1. 分表主鍵的選擇
  2. 分表后跨分區(qū)數(shù)據(jù)的查詢和統(tǒng)計(jì)

1.5 大事務(wù)帶來的問題(重要)

1.5.1 什么是事務(wù) 

 

1.5.2事務(wù)的ACID屬性

1.原子性(atomicity):全部成功,全部回滾失敗。銀行存取款。

2.一致性(consistent):銀行轉(zhuǎn)賬的總金額不變。

3.隔離性(isolation):

隔離性等級:

  • 未提交讀(READ UNCOMMITED) 臟讀,兩個(gè)事務(wù)之間互相可見;
  • 已提交讀(READ COMMITED)符合隔離性的基本概念,一個(gè)事務(wù)進(jìn)行時(shí),其它已提交的事物對于該事務(wù)是可見的,即可以獲取其它事務(wù)提交的數(shù)據(jù)。
  • 可重復(fù)讀(REPEATABLE READ) InnoDB的默認(rèn)隔離等級。事務(wù)進(jìn)行時(shí),其它所有事務(wù)對其不可見,即多次執(zhí)行讀,得到的結(jié)果是一樣的!
  • 可串行化(SERIALIZABLE) 在讀取的每一行數(shù)據(jù)上都加鎖,會造成大量的鎖超時(shí)和鎖征用,嚴(yán)格數(shù)據(jù)一致性且沒有并發(fā)是可使用。

查看系統(tǒng)的事務(wù)隔離級別:show variables like '%iso%';

開啟一個(gè)新事務(wù):begin;

提交一個(gè)事務(wù):commit;

修改事物的隔離級別:set session tx_isolation='read-committed';

4.持久性(DURABILITY):從數(shù)據(jù)庫的角度的持久性,磁盤損壞就不行了 

 

redo log機(jī)制保證事務(wù)更新的一致性和持久性

1.5.3 大事務(wù)

運(yùn)行時(shí)間長,操作數(shù)據(jù)比較多的事務(wù);

風(fēng)險(xiǎn):鎖定數(shù)據(jù)太多,回滾時(shí)間長,執(zhí)行時(shí)間長。

  • 鎖定太多數(shù)據(jù),造成大量阻塞和鎖超時(shí);
  • 回滾時(shí)所需時(shí)間比較長,且數(shù)據(jù)仍然會處于鎖定;
  • 如果執(zhí)行時(shí)間長,將造成主從延遲,因?yàn)橹挥挟?dāng)主服務(wù)器全部執(zhí)行完寫入日志時(shí),從服務(wù)器才會開始進(jìn)行同步,造成延遲。

解決思路:

  • 避免一次處理太多數(shù)據(jù),可以分批次處理;
  • 移出不必要的SELECT操作,保證事務(wù)中只有必要的寫操作。

二、什么影響了MySQL性能(非常重要)

2.1 影響性能的幾個(gè)方面

  • 服務(wù)器硬件。
  • 服務(wù)器系統(tǒng)(系統(tǒng)參數(shù)優(yōu)化)。
  • 存儲引擎。

MyISAM: 不支持事務(wù),表級鎖。

InnoDB: 支持事務(wù),支持行級鎖,事務(wù)ACID。

  • 數(shù)據(jù)庫參數(shù)配置。
  • 數(shù)據(jù)庫結(jié)構(gòu)設(shè)計(jì)和SQL語句。(重點(diǎn)優(yōu)化)

2.2 MySQL體系結(jié)構(gòu)

分三層:客戶端->服務(wù)層->存儲引擎 

 

  1. MySQL是插件式的存儲引擎,其中存儲引擎分很多種。只要實(shí)現(xiàn)符合mysql存儲引擎的接口,可以開發(fā)自己的存儲引擎!
  2. 所有跨存儲引擎的功能都是在服務(wù)層實(shí)現(xiàn)的。
  3. MySQL的存儲引擎是針對表的,不是針對庫的。也就是說在一個(gè)數(shù)據(jù)庫中可以使用不同的存儲引擎。但是不建議這樣做。

2.3 InnoDB存儲引擎

MySQL5.5及之后版本默認(rèn)的存儲引擎:InnoDB。

2.3.1 InnoDB使用表空間進(jìn)行數(shù)據(jù)存儲。

show variables like 'innodb_file_per_table

如果innodb_file_per_table 為 ON 將建立獨(dú)立的表空間,文件為tablename.ibd;

如果innodb_file_per_table 為 OFF 將數(shù)據(jù)存儲到系統(tǒng)的共享表空間,文件為ibdataX(X為從1開始的整數(shù));

.frm :是服務(wù)器層面產(chǎn)生的文件,類似服務(wù)器層的數(shù)據(jù)字典,記錄表結(jié)構(gòu)。

2.3.2 (MySQL5.5默認(rèn))系統(tǒng)表空間與(MySQL5.6及以后默認(rèn))獨(dú)立表空間

1.1 系統(tǒng)表空間無法簡單的收縮文件大小,造成空間浪費(fèi),并會產(chǎn)生大量的磁盤碎片。

1.2 獨(dú)立表空間可以通過optimeze table 收縮系統(tǒng)文件,不需要重啟服務(wù)器也不會影響對表的正常訪問。

2.1 如果對多個(gè)表進(jìn)行刷新時(shí),實(shí)際上是順序進(jìn)行的,會產(chǎn)生IO瓶頸。

2.2 獨(dú)立表空間可以同時(shí)向多個(gè)文件刷新數(shù)據(jù)。

強(qiáng)烈建立對Innodb 使用獨(dú)立表空間,優(yōu)化什么的更方便,可控。

2.3.3 系統(tǒng)表空間的表轉(zhuǎn)移到獨(dú)立表空間中的方法

1、使用mysqldump 導(dǎo)出所有數(shù)據(jù)庫數(shù)據(jù)(存儲過程、觸發(fā)器、計(jì)劃任務(wù)一起都要導(dǎo)出 )可以在從服務(wù)器上操作。

2、停止MYsql 服務(wù)器,修改參數(shù)(my.cnf加入innodb_file_per_table),并刪除Inoodb相關(guān)文件(可以重建Data目錄)。

3、重啟MYSQL,并重建Innodb系統(tǒng)表空間。

4、 重新導(dǎo)入數(shù)據(jù)。

或者 Alter table 同樣可以的轉(zhuǎn)移,但是無法回收系統(tǒng)表空間中占用的空間。

2.4 InnoDB存儲引擎的特性

2.4.1 特性一:事務(wù)性存儲引擎及兩個(gè)特殊日志類型:Redo Log 和 Undo Log

  1. Innodb 是一種事務(wù)性存儲引擎。
  2. 完全支持事務(wù)的ACID特性。
  3. 支持事務(wù)所需要的兩個(gè)特殊日志類型:Redo Log 和Undo Log

Redo Log:實(shí)現(xiàn)事務(wù)的持久性(已提交的事務(wù))。

Undo Log:未提交的事務(wù),獨(dú)立于表空間,需要隨機(jī)訪問,可以存儲在高性能io設(shè)備上。

Undo日志記錄某數(shù)據(jù)被修改前的值,可以用來在事務(wù)失敗時(shí)進(jìn)行rollback;Redo日志記錄某數(shù)據(jù)塊被修改后的值,可以用來恢復(fù)未寫入data file的已成功事務(wù)更新的數(shù)據(jù)。

2.4.2 特性二:支持行級鎖

  1. InnoDB支持行級鎖。
  2. 行級鎖可以***程度地支持并發(fā)。
  3. 行級鎖是由存儲引擎層實(shí)現(xiàn)的。

2.5 什么是鎖

2.5.1 鎖  

 

2.5.2 鎖類型 

 

2.5.3 鎖的粒度

MySQL的事務(wù)支持不是綁定在MySQL服務(wù)器本身,而是與存儲引擎相關(guān) 

 

將table_name加表級鎖命令:lock table table_name write; 寫鎖會阻塞其它用戶對該表的‘讀寫’操作,直到寫鎖被釋放:unlock tables;

  1. 鎖的開銷越大,粒度越小,并發(fā)度越高。
  2. 表級鎖通常是在服務(wù)器層實(shí)現(xiàn)的。
  3. 行級鎖是存儲引擎層實(shí)現(xiàn)的。innodb的鎖機(jī)制,服務(wù)器層是不知道的

2.5.4 阻塞和死鎖

(1)阻塞是由于資源不足引起的排隊(duì)等待現(xiàn)象。

(2)死鎖是由于兩個(gè)對象在擁有一份資源的情況下申請另一份資源,而另一份資源恰好又是這兩對象正持有的,導(dǎo)致兩對象無法完成操作,且所持資源無法釋放。

2.6 如何選擇正確的存儲引擎

參考條件:

  1. 事務(wù)
  2. 備份(Innobd免費(fèi)在線備份)
  3. 崩潰恢復(fù)
  4. 存儲引擎的特有特性

總結(jié):Innodb大法好。

注意:盡量別使用混合存儲引擎,比如回滾會出問題在線熱備問題。

2.7 配置參數(shù)

2.7.1 內(nèi)存配置相關(guān)參數(shù)

確定可以使用的內(nèi)存上限。

內(nèi)存的使用上限不能超過物理內(nèi)存,否則容易造成內(nèi)存溢出;(對于32位操作系統(tǒng),MySQL只能試用3G以下的內(nèi)存。)

確定MySQL的每個(gè)連接單獨(dú)使用的內(nèi)存。

sort_buffer_size #定義了每個(gè)線程排序緩存區(qū)的大小,MySQL在有查詢、需要做排序操作時(shí)才會為每個(gè)緩沖區(qū)分配內(nèi)存(直接分配該參數(shù)的全部內(nèi)存);join_buffer_size #定義了每個(gè)線程所使用的連接緩沖區(qū)的大小,如果一個(gè)查詢關(guān)聯(lián)了多張表,MySQL會為每張表分配一個(gè)連接緩沖,導(dǎo)致一個(gè)查詢產(chǎn)生了多個(gè)連接緩沖;read_buffer_size #定義了當(dāng)對一張MyISAM進(jìn)行全表掃描時(shí)所分配讀緩沖池大小,MySQL有查詢需要時(shí)會為其分配內(nèi)存,其必須是4k的倍數(shù);read_rnd_buffer_size #索引緩沖區(qū)大小,MySQL有查詢需要時(shí)會為其分配內(nèi)存,只會分配需要的大小。

注意:以上四個(gè)參數(shù)是為一個(gè)線程分配的,如果有100個(gè)連接,那么需要×100。

MySQL數(shù)據(jù)庫實(shí)例:

①M(fèi)ySQL是單進(jìn)程多線程(而oracle是多進(jìn)程),也就是說MySQL實(shí)例在系統(tǒng)上表現(xiàn)就是一個(gè)服務(wù)進(jìn)程,即進(jìn)程;

②MySQL實(shí)例是線程和內(nèi)存組成,實(shí)例才是真正用于操作數(shù)據(jù)庫文件的;

一般情況下一個(gè)實(shí)例操作一個(gè)或多個(gè)數(shù)據(jù)庫;集群情況下多個(gè)實(shí)例操作一個(gè)或多個(gè)數(shù)據(jù)庫。

如何為緩存池分配內(nèi)存:

Innodb_buffer_pool_size,定義了Innodb所使用緩存池的大小,對其性能十分重要,必須足夠大,但是過大時(shí),使得Innodb 關(guān)閉時(shí)候需要更多時(shí)間把臟頁從緩沖池中刷新到磁盤中;

總內(nèi)存-(每個(gè)線程所需要的內(nèi)存*連接數(shù))-系統(tǒng)保留內(nèi)存

key_buffer_size,定義了MyISAM所使用的緩存池的大小,由于數(shù)據(jù)是依賴存儲操作系統(tǒng)緩存的,所以要為操作系統(tǒng)預(yù)留更大的內(nèi)存空間;

select sum(index_length) from information_schema.talbes where engine='myisam'

注意:即使開發(fā)使用的表全部是Innodb表,也要為MyISAM預(yù)留內(nèi)存,因?yàn)镸ySQL系統(tǒng)使用的表仍然是MyISAM表。

max_connections 控制允許的***連接數(shù), 一般2000更大。

不要使用外鍵約束保證數(shù)據(jù)的完整性。

2.8 性能優(yōu)化順序

從上到下: 

 

責(zé)任編輯:龐桂玉 來源: 民工哥技術(shù)之路
相關(guān)推薦

2019-11-05 10:12:21

MySQL性能查詢

2010-05-21 18:01:13

2011-04-02 16:39:53

SQL Server查詢

2011-04-02 16:45:58

SQL Server查詢優(yōu)化

2010-06-29 09:56:00

SQL Server查

2011-09-07 14:55:47

ubuntudns

2010-05-24 08:54:10

2018-03-05 10:27:47

電腦卡頓舊電腦

2011-03-08 13:52:25

Proftpd

2010-06-18 12:37:04

SQL Server查

2010-07-09 09:08:43

2010-07-09 08:46:34

SQL Server查

2010-06-29 10:39:48

SQL Server查

2010-11-09 10:54:47

SQL Server查

2011-03-16 13:57:21

SQL Server數(shù)據(jù)庫查詢

2010-11-09 11:07:18

2012-05-24 09:53:01

Wi-Fi速度Wi-Fi

2013-01-24 16:42:51

安全寶CDN

2014-01-10 14:08:57

WLAN速度優(yōu)化

2021-09-10 22:20:51

WiFi網(wǎng)絡(luò)技術(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 一区中文字幕 | 隔壁老王国产在线精品 | 日韩精品一区二区三区四区视频 | 91天堂| 综合久久99 | 国产精品伦理一区二区三区 | 黄色骚片 | 欧美激情在线精品一区二区三区 | 国产成人精品一区二三区在线观看 | 一区二区三区国产好 | 妖精视频一区二区三区 | 天天干天天色 | 日韩a| 国产精品一区在线 | 九色在线视频 | 久久一区二区三区电影 | 中文字幕av在线一二三区 | 国产在线一区二区三区 | 成人高清在线 | 久久久久久91香蕉国产 | 一区二区三区国产精品 | 成人av片在线观看 | 成人不卡视频 | 一道本不卡| 国产一级片在线观看视频 | 黄网站在线播放 | 伊人网伊人 | 精品国产乱码久久久久久果冻传媒 | 亚洲一区二区三区久久久 | 日韩成人免费视频 | 日韩三级 | 国产欧美视频一区二区 | 中文字幕av一区二区三区 | 麻豆va | 欧美一级二级在线观看 | 欧美一区二区三区四区五区无卡码 | 精品国产乱码久久久久久丨区2区 | 久久久人 | 日韩av在线免费 | 天天插天天操 | 国产乱码精品一区二区三区忘忧草 |