mysql分表 查詢 優化_MySQL性能管理及架構(查詢優化、分庫分表)一遍文章搞定...

相關配置參數:

slow_query_log # 啟動停止記錄慢查日志,慢查詢日志默認是沒有開啟的可以在配置文件中開啟(on)

slow_query_log_file # 指定慢查日志的存儲路徑及文件,日志存儲和數據從存儲應該分開存儲

long_query_time # 指定記錄慢查詢日志SQL執行時間的閥值默認值為10秒通常,對于一個繁忙的系統來說,改為0.001秒(1毫秒)比較合適

log_queries_not_using_indexes #是否記錄未使用索引的SQL

復制代碼

常用工具: mysqldumpslow 和 pt-query-digest

pt-query-digest --explain h=127.0.0.1,u=root,p=p@ssWord slow-mysql.log

復制代碼

1.1.3 實時獲取有性能問題的SQL(推薦)

87a449f68513d7623ea93db33b418e59.png

SELECT id,user,host,DB,command,time,state,info

FROM information_schema.processlist

WHERE TIME>=60

復制代碼

查詢當前 服務器 執行超過60s的SQL,可以通過腳本周期性的來執行這條SQL,就能查出有問題的SQL。

1.2 SQL的解析預處理及生成執行計劃(重要)

1.2.1 查詢過程描述(重點!!!)

90e0c5839d4df1acd892373f73ca1b7e.png 通過上圖可以清晰的了解到 MySql 查詢執行的大致過程:

1.發送SQL語句。

2.查詢緩存,如果命中緩存直接返回結果。

3.SQL解析,預處理,再由優化器生成對應的查詢執行計劃。

4.執行查詢,調用存儲引擎API獲取數據。

5.返回結果。

1.2.2 查詢緩存對性能的影響(建議關閉緩存)

第一階段:

相關配置參數:

query_cache_type # 設置查詢緩存是否可用

query_cache_size # 設置查詢緩存的內存大小

query_cache_limit # 設置查詢緩存可用的存儲最大值(加上sql_no_cache可以提高效率)

query_cache_wlock_invalidate # 設置數據表被鎖后是否返回緩存中的數據

query_cache_min_res_unit # 設置查詢緩存分配的內存塊的最小單

復制代碼

緩存查找是利用對大小寫敏感的哈希查找來實現的,Hash查找只能進行全值查找(sql完全一致),

如果緩存命中,檢查用戶權限,如果權限允許,直接返回,查詢不被解析,也不會生成查詢計劃。

復制代碼

在一個讀寫比較頻繁的系統中,建議 關閉緩存 ,因為緩存更新會加鎖。將 query_cache_type 設置為 off , query_cache_size 設置為 0 。

1.2.3 第二階段:MySQL依照執行計劃和存儲引擎進行交互

這個階段包括了多個子過程:

8b4c9497c414726569e6011b29d470ec.png

0f9e374ef2c65cd246a174e14bae1667.png

3579c6b7c846512130e182199e531baa.png

一條查詢可以有多種查詢方式,查詢優化器會對每一種查詢方式的(存儲引擎)統計信息進行比較,找到成本最低的查詢方式,這也就是索引不能太多的原因。

1.3 會造成MySQL生成錯誤的執行計劃的原因

1、統計信息不準確

2、成本估算與實際的執行計劃成本不同

0ad31c04ef51ec77a7318060cc6145ef.png

3、給出的最優執行計劃與估計的不同

d8d2b7428eeb3d5a7893c06403985b3d.png

4、MySQL不考慮并發查詢

5、會基于固定規則生成執行計劃

6、MySQL不考慮不受其控制的成本,如存儲過程,用戶自定義函數

1.4 MySQL優化器可優化的SQL類型

查詢優化器:對查詢進行優化并查詢mysql認為的成本最低的執行計劃。

為了生成最優的執行計劃,查詢優化器會對一些查詢進行改寫

復制代碼

可以優化的sql類型

1、重新定義表的關聯順序;

bf8a8ccc71189595f04b4b7713e59bb6.png

2、將外連接轉換為內連接;

3、使用等價變換規則;

7b9bef6344f714773a82b873d8dbd334.png

4、優化count(),min(),max();

536129baf868303046774fdc5ba93e13.png

5、將一個表達式轉換為常數;

6、子查詢優化;

f78e65cb8bea7f8d4c8c45ada8e9c646.png

7、提前終止查詢,如發現一個不成立條件(如where id = -1),立即返回一個空結果;

8、對in()條件進行優化;

1.5 查詢處理各個階段所需要的時間

1.5.1 使用profile(目前已經不推薦使用了)

set profiling = 1; #啟動profile,這是一個session級的配制執行查詢

show profiles; # 查詢每一個查詢所消耗的總時間的信息

show profiles for query N; # 查詢的每個階段所消耗的時間

1.5.2 performance_schema是5.5引入的一個性能分析引擎(5.5版本時期開銷比較大)

啟動監控和歷史記錄表: use performance_schema

update setup_instruments set enabled='YES',TIME = 'YES' WHERE NAME LIKE 'stage%';

update set_consumbers set enabled='YES',TIME = 'YES' WHERE NAME LIKE 'event%';

復制代碼

c69a74f568e2fbad98f5103890a95679.png

69887b8248526c13b85a492fa6faf101.png

1.6 特定SQL的查詢優化

1.6.1 大表的數據修改

fb09a79bb0bc5433ed0778e9e3a978a0.png

e47d4d400f31d1b44e9ac0131f86a38c.png

1.6.2 大表的結構修改

a3f26f09ea2ad38850693acd6293af9f.png

1.利用主從復制,先對從服務器進入修改,然后主從切換

2.(推薦)

添加一個新表(修改后的結構),老表數據導入新表,老表建立觸發器,修改數據同步到新表,

老表加一個排它鎖(重命名), 新表重命名, 刪除老表。

復制代碼

3a6c543b9779f9edb101a671abb7984d.png

修改語句這個樣子:

alter table sbtest4 modify c varchar(150) not null default ''

復制代碼

利用 工具 修改:

4cc93d3acedbaa408081462f0b9e6533.png

1.6.3 優化not in 和 <> 查詢

子查詢改寫為關聯查詢:

f674c52b742a527ba7eee23f8e5ee6bc.png

二、分庫分表

2.1 分庫分表的幾種方式

分擔讀負載 可通過 一主多從,升級硬件來解決。

復制代碼

2.1.1 把一個實例中的多個 數據庫 拆分到不同實例(集群)

5992e495026eb9d94f3af7346f753e1e.png

拆分簡單,不允許跨庫。但并不能減少寫負載

復制代碼

2.1.2 把一個庫中的表分離到不同的數據庫中

a6675a15450a07c187a6ca979f28c65d.png

該方式只能在一定時間內減少寫壓力。

以上兩種方式只能暫時解決讀寫性能問題。

2.1.3 數據庫分片

對一個庫中的相關表進行水平拆分到不同實例的數據庫中

復制代碼

bd326a87eea739044a126443b1570c56.png

2.1.3.1 如何選擇分區鍵

1.分區鍵要能盡可能避免跨分區查詢的發生

2.分區鍵要盡可能使各個分區中的數據平均

2.1.3.2 分片中如何生成全局唯一ID

248dde229597541f135eeaadc0d0613c.png

擴展:表的垂直拆分和水平拆分

隨著業務的發展,數據庫成為了整個系統性能的一個瓶頸,這時候就需要對數據庫進行優化,但是單單是優化只能提高有限的一點性能,這時候要想解決問題需要的是從數據庫架構層面去思考問題。數據庫的架構是一個很大的課題,里面最實用的有兩個,一個是數據庫拆分,一個是讀寫分離。今天就來談談數據庫的兩種拆分方式。

一、垂直拆分

垂直拆分很簡單,就是根據不同的業務來劃分不同的數據庫。比如一個電商系統根據業務可以分成商品表、會員表、訂單表。原先,這些表都是放在同一個數據庫服務器上,現在需要垂直拆分數據庫,就是將商品表單獨放在一個數據庫中,會員表單獨放在一個數據庫中,訂單表單獨放在一個數據庫中,這樣就解決了表與表之間的io競爭。

二、水平拆分

垂直拆分比較簡單,水平拆分就比較復雜了,要考慮很多東西。垂直拆分根據業務來拆分,或者說的直白點就是根據表名來拆分,而水平拆分是根據表里面的字段來拆分(記住是根據字段來拆分,而不是拆分字段,拆分后的每一張表的表結構都是一樣)。比如要拆分用戶表,可以根據用戶的注冊時間這一字段來拆分整個表,2016年注冊的用戶放在用戶表1中,2017年注冊的用戶放在用戶表2中,2018年注冊的用戶放在用戶表3中。這就是水平拆分,看似很簡單,實際上要考慮的東西是很多的。就比如上述的例子,我們用時間來拆分,就會有局限性。一個好產品上線后,在開始的時候用戶數量都是很少的,都需要一定時間的沉淀,才會有一個用戶數量的爆發期。如果用時間來拆分,就會出現一種情況,就是用戶表1的規模很小,而用戶表2的規模卻很大,是用戶表1的好幾倍,而用戶表三可能是用戶表1的好幾十倍。這樣的話,拆分水平拆分的意義就不大了。一般用戶表都是用戶id來拆分的,具體還要結合實際業務去分析。所以,水平拆分是一件很復雜的事情,大家在進行水平拆分的時候一定要考慮到方方面面,這樣才能設計出優秀的數據庫架構方案。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/534257.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/534257.shtml
英文地址,請注明出處:http://en.pswp.cn/news/534257.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

dokcer mysql修改編碼_默認支持utf8編碼的mysql docker鏡像

其他人都是不正確的使用mysql容器鏡像可以很快速的運行mysql&#xff0c;免去了傳統的虛擬機安裝方式的繁瑣配置。但是使用官方的mysql鏡像&#xff0c;你會遇到中文亂碼的問題&#xff0c;原因是官方鏡像的字符集默認值不是utf8。這時候你去google&#xff0c;會找到一些文章&…

mysql臨時表 清空_在數據庫中臨時表什么時候會被清除呢

展開全部我們仍使用 實驗 05 中的環境&#xff0c;略去準備數據的過程。我們仍然使用兩個會話&#xff0c;62616964757a686964616fe59b9ee7ad9431333433646439一個會話 run&#xff0c;用于運行主 SQL&#xff1b;另一個會話 ps&#xff0c;用于進行 performance_schema 的觀察…

locust mysql_locust性能壓測連接mysql,隨機取出班級,綁定學生

from locust import HttpLocust, TaskSet, taskimport pymysqlimport randomclass UserBehavior(TaskSet):def on_start(self):db pymysql.connect("ip地址", "用戶名", "密碼", "數據庫")cursor db.cursor()cursor.execute("S…

mysql無法添加或更新子行_違反完整性約束:1452無法添加或更新子行:

我試圖在我的注釋表中插入值&#xff0c;但出現錯誤。俗話說&#xff0c;我不能添加或更新子行&#xff0c;我也不知道這意味著什么。我的架構看起來像這樣-- ------------------------------ Table structure for comments-- ----------------------------DROP TABLE IF EXIST…

python醫學圖像分割_基于cv2的醫學圖像分割

例如&#xff0c;圖像如下所示&#xff1a;import cv2import numpy as npimg cv2.imread("mdb168.pgm",0)import matplotlib.pyplot as pltplt.imshow(img, cmap"gray")我想刪除圖像中所有的偽影和不必要的部分。在為此&#xff0c;我首先對圖像進行二值化…

python解析response的json_從HTML responseTex解析JSON

因此&#xff0c;我大體上同意&#xff0c;更好的解決方案是確保服務器只返回JSON&#xff0c;不過這是通過客戶端Javascript實現的一種快速方法&#xff0c;如Barmer所建議的那樣&#xff0c;將html解析到DOM&#xff0c;獲取body中的文本childNode并在其上運行JSONParse。在v…

mysql 密碼修改時間_Mysql修改密碼的方法

修改mysql密碼的方法&#xff1a;最簡單的&#xff0c;在Navicat連接后點用戶&#xff0c;找到rootlocalhost直接修改。注意如果裝了xampp&#xff0c;在phpmyadmin配置文件也需要改兩處密碼。下面是在命令行修改的方法。方法1&#xff1a;用mysqladmin----------------親測這個…

svn版本庫瀏覽器_在SVN版本庫瀏覽器中直接編輯文件保存后不會彈..._網絡編輯_幫考網...

原因是沒有實際添加到版本庫中&#xff0c;要添加到版本庫必須執行“Commit”。具體分析如下&#xff1a;SVN錯誤處理svn : Couldn’t perform atomic initialization. 臨時解決辦法&#xff1a;升級sqlite。原本安裝的是 subversion 1.6.16 sqlite 3.6.13&#xff0c;一直報”…

ubuntu下使用python將ppt轉成圖片_Ubuntu下使用Python實現游戲制作中的切分圖片功能...

本文實例講述了Ubuntu下使用Python實現游戲制作中的切分圖片功能。分享給大家供大家參考&#xff0c;具體如下&#xff1a;why拿到一個人物行走的素材&#xff0c;要用TexturePacker打包。TexturePacker打包后&#xff0c;助于游戲加載圖片效率&#xff0c;且比較好管理。目前得…

世上最簡單的mysql_mysql這樣學最簡單|基本操作上

這是數據庫系列的第一篇文章&#xff0c;主要是對mysql的基本操作有一個了解。本系列的教程會先從基礎出發&#xff0c;逐步過渡到優化。一、前提在這里我們不會從如何去安裝數據庫開始講起&#xff0c;而是在安裝完之后從操作數據庫開始&#xff0c;文中所有的代碼均在我自己的…

django ipython shell_django shell ipython 模型層優化(關聯對象) 懶加載和預加載 +長鏈接...

懶加載存在于外鍵和多對多關系不檢索關聯對象的數據調用關聯對象會再次查詢數據庫問題根源查看django orm的數據加載,兩次. 查詢user,查詢menu第一次查詢 用戶表 第二次查詢 app表cmd:python manage.py shell #進入shell調試 或者ipythonfrom authorization.models import Use…

zabbix4.0添加mysql報警_Zabbix4.0系統告警“Zabbix server is not running”

第一步&#xff1a; 查看系統日志&#xff0c;進一步確認原因1 cat /var/log/zabbix/zabbix_server.log問題出現在數據庫。第二步 數據庫確認1 mysql -u root -p #root用戶登陸數據庫如果登錄不成功&#xff0c;就看一下登錄密碼是否正確以及zabbix用戶是否有權限登錄數據庫。1…

影響索引的mysql函數_mysql索引對排序的影響實例分析

本文實例講述了mysql索引對排序的影響。分享給大家供大家參考&#xff0c;具體如下&#xff1a;索引不僅能提高查詢速度&#xff0c;還可以添加排序速度&#xff0c;如果order by 后面的語句用到了索引&#xff0c;那么將會提高排序的速度。測試1、創建測試表&#xff1a;t15表…

php如何對 mysql 中text類型拆分存入一個數組_PHP遞歸實現無限級分類,可選返回字符串和數組...

正 文&#xff1a;在一些復雜的系統中&#xff0c;要求對信息欄目進行無限級的分類&#xff0c;以增強系統的靈活性。那么PHP是如何實現無限級分類的呢&#xff1f;我們在本文中使用遞歸算法并結合mysql數據表實現無限級分類。遞歸&#xff0c;簡單的說就是一段程序代碼的重復調…

python 開發框架 ant_Golang/python語言開發的分布式游戲服務器框架 mqant

軟件介紹mqantmqant 是一款基于 Golang 語言的簡潔&#xff0c;高效&#xff0c;高性能的分布式游戲服務器框架&#xff0c;研發的初衷是要實現一款能支持高并發&#xff0c;高性能&#xff0c;高實時性的游戲服務器框架&#xff0c;也希望 mqant 未來能夠做即時通訊和物聯網方…

java w3c xml_org.w3c.dom(java dom)解析XML文檔

首先來了解點Java DOM 的 API:1.解析器工廠類&#xff1a;DocumentBuilderFactory創建的方法&#xff1a;DocumentBuilderFactory dbf DocumentBuilderFactory.newInstance();2.解析器&#xff1a;DocumentBuilder創建方法&#xff1a;通過解析器工廠類來獲得 DocumentBuilder…

java中小數點位數_Java中限制小數位數問題

在Java中限制小數位數的方法不止一種&#xff0c;下面我們以限制兩位小數為例來說明幾種限制小數位數的方法&#xff0c;其他位數可以以此類推方式一&#xff1a;四舍五入double f 111231.5585;BigDecimal b new BigDecimal(f);double f1 b.setScale(2,…

orange pi java_[中文]Orange Pi家族各大成員一覽表

全部復制來自官網&#xff0c;只修改了錯別字和優化了排版。Orange Pi Zero香橙派Zero是一款開源的單板電腦&#xff0c;新一代的arm開發板,它可以運行Android4.4、Ubuntu、Debian等操作系統。香橙派Zero使用全志H2系統級芯片&#xff0c;同時擁有256MB/512MB DDR3 內存(256MB為…

java 微服務源碼_基于Java的微服務架構源碼案例Abixen

微服務越來越受歡迎&#xff0c;每個月都有更多的庫包和解決方案來支持微服務的開發測試&#xff0c;很多Java開發人員雖然聽說過微服務&#xff0c;但是真正采用還是有猶豫的&#xff1a;“我知道&#xff0c;微服務是非常棒的&#xff0c;微服務器更容易維護和進一步開發&…

rocketmq java例子_SpringBoot和RocketMQ的簡單實例

1&#xff0c;引用jar包build.gradle文件添加jar包引用compile group: org.apache.rocketmq, name: rocketmq-spring-boot-starter, version: 2.1.12&#xff0c;配置文件application.properties 配置文件spring.application.nameapp-dempserver.port8081###rocketmq###rocketm…