主頁 > 資料庫 > phper使用MySQL 針對千萬級的大表要怎么優化?

phper使用MySQL 針對千萬級的大表要怎么優化?

2020-09-21 05:50:19 資料庫

有需要學習交流的友人請加入交流群的咱們一起,群內都是1-7年的開發者,希望可以一起交流,探討PHP,swoole這塊的技術 或者有其他問題 也可以問,獲取swoole或者php進階相關資料私聊管理即可

點此加入該群?jq.qq.com

 首先采用Mysql存盤千億級的資料,確實是一項非常大的挑戰,Mysql單表確實可以存盤10億級的資料,只是這個時候性能非常差,專案中大量的實驗證明,Mysql單表容量在500萬左右,性能處于最佳狀態,

針對大表的優化,主要是通過資料庫分庫分表來解決,目前比較普遍的方案有三個:磁區,分庫分表,NoSql/NewSql,實際專案中,這三種方案是結合的,目前絕大部分系統的核心資料都是以RDBMS存盤為主,NoSql/NewSql存盤為輔,

磁區

首先來了解一下磁區方案,

磁區表是由多個相關的底層表實作的,這些底層表也是由句柄物件表示,所以我們也可以直接訪問各個磁區,存盤引擎管理磁區的各個底層表和管理普通表一樣(所有的底層表都必須使用相同的存盤引擎),磁區表的索引只是在各個底層表上各自加上一個相同的索引,這個方案對用戶屏蔽了sharding的細節,即使查詢條件沒有sharding column,它也能正常作業(只是這時候性能一般),

不過它的缺點很明顯:很多的資源都受到單機的限制,例如連接數,網路吞吐等,如何進行磁區,在實際應用中是一個非常關鍵的要素之一,

下面開始舉例:以客戶資訊為例,客戶資料量5000萬加,專案背景要求保存客戶的銀行卡系結關系,客戶的證件系結關系,以及客戶系結的業務資訊,

此業務背景下,該如何設計資料庫呢,專案一期的時候,我們建立了一張客戶業務系結關系表,里面冗余了每一位客戶系結的業務資訊,

基本結構大致如下:

 

 

查詢時,對銀行卡做索引,業務編號做索引,證件號做索引,隨著需求大增多,這張表的索引會達到10個以上,而且客戶解約再簽約,里面會保存兩條資料,只是系結的狀態不同,

假設我們有5千萬的客戶,5個業務型別,每位客戶平均2張卡,那么這張表的資料量將會達到驚人的5億,事實上我們系統用戶量還沒有過百萬時就已經不行了,這樣的設計絕對是不行的,無論是插入,還是查詢,都會讓系統崩潰,

 mysql資料庫中的資料是以檔案的形勢存在磁盤上的,默認放在/mysql/data下面(可以通過my.cnf中的datadir來查看), 一張表主要對應著三個檔案,一個是frm存放表結構的,一個是myd存放表資料的,一個是myi存表索引的,這三個檔案都非常的龐大,尤其是.myd檔案,快5個G了,下面進行第一次磁區優化,Mysql支持的磁區方式有四種:

在我們的專案中,range磁區和list磁區沒有使用場景,如果基于系結編號做range或者list磁區,系結編號沒有實際的業務含義,無法通過它進行查詢,因此,我們就剩下 HASH 磁區和 KEY 磁區了,HASH磁區僅支持int型別列的磁區,且是其中的一列,

KEY 磁區倒是可以支持多列,但也要求其中的一列必須是int型別;看我們的庫表結構,發現沒有哪一列是int型別的,如何做磁區呢?增加一列,系結時間列,將此列設定為int型別,然后按照系結時間進行磁區,將每一天系結的用戶分到同一個區里面去,

這次優化之后,我們的插入快了許多,但是查詢依然很慢,為什么?

因為在做查詢的時候,我們也只是根據銀行卡或者證件號進行查詢,并沒有根據時間查詢,相當于每次查詢,mysql都會將所有的磁區表查詢一遍,

進行第二次方案優化,既然 HASH 磁區和 KEY磁區要求其中的一列必須是int型別的,那么創造出一個int型別的列出來磁區是否可以?

分析發現,銀行卡的那串數字有秘密,銀行卡一般是16位到19位不等的數字串,我們取其中的某一位拿出來作為表磁區是否可行呢,通過分析發現,在這串數字中,其中確實有一位是0到9隨機生成的,我們基于銀行卡號+隨機位進行KEY磁區,每次查詢的時候,通過計算截取出這位隨機位數字,再加上卡號,聯合查詢,達到了磁區查詢的目的,需要說明的是,磁區后,建立的索引,也必須是磁區列,否則Mysql還是會在所有的磁區表中查詢資料,

通過銀行卡號查詢系結關系的問題解決了,那么證件號呢,如何通過證件號來查詢系結關系,

前面已經講過,做索引一定是要在磁區健上進行,否則會引起全表掃描,我們再創建了一張新表,保存客戶的證件號系結關系,每位客戶的證件號都是唯一的,新的證件號系結關系表里,證件號作為了主鍵,那么如何來計算這個磁區健呢,客戶的證件資訊比較龐雜,有身份證號,港澳臺通行證,機動車駕駛證等等,如何在無序的證件號里找到磁區健,

為了解決這個問題,我們將證件號系結關系表一分為二,其中的一張表專用于保存身份證型別的證件號,另一張表則保存其他證件型別的證件號,在身份證型別的證件系結關系表中,我們將身份證號中的月數拆分出來作為了磁區健,將同一個月出生的客戶證件號保存在同一個區,這樣分成了12個區,其他證件型別的證件號,資料量不超過10萬,就沒有必要進行磁區了,

這樣每次查詢時,首先通過證件型別確定要去查詢哪張表,再計算磁區健進行查詢,作了磁區設計之后,保存2000萬用戶資料時銀行卡表的資料保存檔案就分成了10個小檔案,證件表的資料保存檔案分成了12個小檔案,解決了這兩個查詢的問題,還剩下一個問題:業務編號怎么辦?一個客戶有多個簽約業務,如何進行保存?這時候,采用磁區的方案就不太合適了,它需要用到分表的方案,

 分表

我們前面有提到過對于mysql,其資料檔案是以檔案形式存盤在磁盤上的,當一個資料檔案過大時,作業系統對大檔案的操作就會比較麻煩耗時,且有的作業系統就不支持大檔案,這個時候就必須分表了,

另外對于mysql常用的存盤引擎是Innodb,它的底層資料結構是B+樹,當其資料檔案過大的時候,查詢一個節點可能會查詢很多層次,而這必定會導致多次IO操作進行裝載進記憶體,肯定會耗時的,

除此之外還有Innodb對于B+樹的鎖機制,對每個節點進行加鎖,那么當更改表結構的時候,這時候就會樹進行加鎖,當表檔案大的時候,這可以認為是不可實作的,所以綜上我們就必須進行分表與分庫的操作,

如何進行分庫分表,目前互聯網上有許多的版本,比較知名的一些方案:阿里的TDDL,DRDS和cobar,京東金融的sharding-jdbc;民間組織的MyCAT;360的Atlas;美團的zebra;其他比如網易,58,京東等公司都有自研的中間件,

這么多的分庫分表中間件方案歸總起來,就兩類:client模式和proxy模式,

 

 

client模式

 

 

proxy模式

無論是client模式,還是proxy模式,幾個核心的步驟是一樣的:SQL決議,重寫,路由,執行,結果歸并,個人比較傾向于采用client模式,它架構簡單,性能損耗也比較小,運維成本低,

如何對業務型別進行分庫分表,分庫分表最重要的一步,即sharding column的選取,sharding column選擇的好壞將直接決定整個分庫分表方案最終是否成功,而sharding column的選取跟業務強相關,

在我們的專案場景中,sharding column無疑最好的選擇是業務編號,通過業務編號,將客戶不同的系結簽約業務保存到不同的表里面去,根據業務編號路由到相應的表中進行查詢,達到進一步優化sql的目的,

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/94434.html

標籤:MySQL

上一篇:MySQL資料庫Group by分組之后再統計數目Count(*)與不分組直接統計數目的區別

下一篇:阿里云esc 安裝 mysql8.0

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more