成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

MySQL學習記錄之KEY分區引發的血案

瀏覽:137日期:2023-10-09 18:51:03

需求背景

業務表tb_image部分數據如下所示,其中id唯一,image_no不唯一。image_no表示每個文件的編號,每個文件在業務系統中會生成若干個文件,每個文件的唯一ID就是字段id:

MySQL學習記錄之KEY分區引發的血案

業務表tb_image的一些情況如下:

根據image_no查詢和根據id查詢; 存量數據2kw; 日增長4w左右; 日查詢量20w左右; 非ToC系統,所以并發的天花板可見;

方案選擇

根據上面對業務的分析,分庫分表完全沒有必要。單庫分表的話,由于要根據image_no和id查詢,所以,一種方案是冗余分表(即一份數據以image_no為分片鍵保存,另一份數據以id為分片鍵保存);另一種方案是只以image_no為分片鍵,而基于id的查詢需求,業務層進行結果歸并或者引入第三方中間件。

考慮到單庫分表比較復雜,所以決定使用分區特性,而且容量評估分區表方案128個分區(每個分區數據量kw級別)完全能保證業務至少穩定運行15年(圖中橙色部分是比較貼合自身業務實際增長情況):

MySQL學習記錄之KEY分區引發的血案

另外,由于RANGE, LIST, HASH分區都不支持VARCHAR列,所以決定采用KEY分區,官方介紹它的原理是以MySQL內置hash算法然后對分區數取模。

性能測試

選定分片鍵為image_no,并且決定分區數為128后,就要灌入數據進行可行性和性能測試了。分區數選擇128的原因是:11億/1kw=110≈128,另外程序員情節,喜歡用2的N次方,你懂的。然而, 這個分區數128就是一切噩夢的開始 。

我嘗試先插入10w數據到128個分區中,插入后,讓我驚訝的現象出現了: 所有奇數編號分區(p1, p3, p5, … , p2n-1)中居然沒有一條數據 ,同時,任何一個偶數編號分區卻有很多的數據,而且還不是很均勻。如下圖所示:

MySQL學習記錄之KEY分區引發的血案

說明:奇數編號分區的ibd文件大小都是112k,這是創建分區表時初始化大小,實際并沒有任何數據。我們可以通過SQL: select partition_name, partition_expression, table_rows from information_schema.partitions where table_schema = schema() and table_name=’image_subpart’ ;驗證,其部分結果如下圖所示:

難道10w條數據還不夠說明問題?平均下來每個分區可是有近800條數據!好吧,來點猛的:我再插入990w條數據,總計1kw數據。結果還是一樣,奇數編號分區沒有數據,偶數編號都有分區。

問題思考

我們再來回想一下KEY分區的原理: 通過MySQL內置hash算法對分片鍵計算hash值后再對分區數取模 。這個原理也可以從MySQL官網找到,請戳鏈接:22.2.5 KEY Partitioning: https://dev.mysql.com/doc/refman/5.7/en/partitioning-key.html,截取原文如下:

Partitioning by key is similar to partitioning by hash, except that where hash partitioning employs a user-defined expression, the hashing function for key partitioning is supplied by the MySQL server. NDB Cluster uses MD5() for this purpose; for tables using other storage engines, the server employs its own internal hashing function which is based on the same algorithm as PASSWORD().

**這個世界上不會有這么渣渣的hash算法吧?**隨便寫個什么算法也不至于這么不均勻吧?這時候我懷疑是否有一些什么配置引起的。但是show variables中并沒有任何與partition相關的變量。

這個時候,一萬匹馬奔騰而過。會不會是文檔和源碼不同步導致的?好吧,看MySQL的源碼,畢竟, 源碼才是最接近真相的地方 。KEY分區相關源碼在文件sql_partition.cc中,筆者截取部分關鍵源碼,如下所示,初略觀察,并沒有什么不妥,先計算分區字段的hash值然后對分區數取模:

/** Calculate part_id for (SUB)PARTITION BY KEY @param fileHandler to storage engine @param field_array Array of fields for PARTTION KEY @param num_parts Number of KEY partitions @param func_value[out] Returns calculated hash value @return Calculated partition id*/inlinestatic uint32 get_part_id_key(handler *file, Field **field_array, uint num_parts, longlong *func_value){ DBUG_ENTER('get_part_id_key'); // 計算分區字段的hash值 *func_value= file->calculate_key_hash_value(field_array); // 對分區數取模 DBUG_RETURN((uint32) (*func_value % num_parts));}

懷著絕望的心情,請出搜索引擎搜索:“KEY分區數據不均勻”,搜索結果中的CSDN論壇( https://bbs.csdn.net/topics/390857704)里有個民間高手華夏小卒回答如下:

一個同事根據password函數,分析并測出,key分區,只能指定分區數目為質數,才能保證每個分區都有數據。我測了下,從11個分區,到17個分區。 只有11,13,17 ,這3個分區的數據是基本平均分布的。

這個時候,又是一萬匹馬奔騰而過。不過 WHAT THE F**K 的同時,心里也是有點小激動,因為可能找到解決辦法了(雖然還不知道MySQL內置hash算法為毛會這樣),最后筆者再次對KEY分區測試并得出總結如下:

如果設置40,64,128等偶數個分區數(PARTITIONS 64),會導致編號為奇數的分區(p1, p3, p5, p7, … p2n-1)完全插不進數據; 如果設置63,121(PARTITIONS 63)這種奇數但非質數個分區數,所有分區都會有數據,但是不均勻; 如果設置137,31這種質數個分區數(PARTITIONS 137),所有分區都會有數據,并且非常均勻;

如下圖所示,是筆者把分區數調整為127并插入100w數據后的情況,通過SQL證明每個分區的數據量幾乎一樣:

MySQL學習記錄之KEY分區引發的血案

總結回顧

MySQL的KEY分區這么大的使用陷阱,居然在官方上沒有任何說明,這讓筆者感到非常震驚。此外還有MySQL bug:Bug #72428 Partition by KEY() results in uneven data distribution

正在看此文并有很強烈興趣的同學,可以嘗試更深入這個問題。筆者接下來也會找個時間,根據MySQL源碼深入挖掘其hash算法的實現為什么對分區數如此敏感。

到此這篇關于MySQL學習記錄之KEY分區引發的血案的文章就介紹到這了,更多相關MySQL KEY分區血案內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: MySQL 數據庫
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
91九色最新地址| 欧美高清一级片在线观看| 久久亚洲一级片| 国产一区二区女| 久久久久久久尹人综合网亚洲| 亚洲精品一二三| 怡红院精品视频在线观看极品| 久久一夜天堂av一区二区三区| 国产精品影视网| 欧美麻豆精品久久久久久| 日本美女一区二区三区视频| 老司机一区二区三区| 国产精品久久久久一区| 99久久精品国产一区| 欧美一级生活片| 国产精品一线二线三线| 欧美色老头old∨ideo| 另类中文字幕网| 色哟哟在线观看一区二区三区| 亚洲国产精品久久久久秋霞影院| 91久久久一线二线三线品牌| 中文字幕一区二区在线观看| 午夜亚洲福利| 国产精品嫩草影院av蜜臀| 欧美在线三区| 国产精品久线观看视频| 亚洲图片在线观看| 国产精品美女一区二区三区| 欧美精品大片| 亚洲欧洲精品一区二区三区不卡 | 精品蜜桃在线看| 成人av资源在线| 久久品道一品道久久精品| 99久久国产免费看| 国产三级三级三级精品8ⅰ区| 93久久精品日日躁夜夜躁欧美| 国产三级精品三级| 在线观看亚洲| 亚洲一二三区在线观看| 一本到三区不卡视频| 天堂一区二区在线| 欧美日韩黄视频| 国产福利一区二区| 久久综合色天天久久综合图片| 91猫先生在线| 中文字幕一区三区| 国产精品一区二区三区免费观看| 亚洲国产视频a| 欧美中文字幕亚洲一区二区va在线| 精品一区二区在线观看| 日韩一区二区免费在线电影| 色综合天天狠狠| 亚洲视频中文字幕| 国产亚洲欧美另类一区二区三区| 爽爽淫人综合网网站| 欧美性大战久久久久久久蜜臀| 国产在线一区观看| 久久天堂av综合合色蜜桃网| 在线观看亚洲| 日本 国产 欧美色综合| 欧美二区在线观看| 91免费在线视频观看| 亚洲精品成a人| 欧美色精品天天在线观看视频| 成人性视频免费网站| 国产精品久久国产精麻豆99网站| 国产精品日韩一区二区三区| 日本视频中文字幕一区二区三区| 538在线一区二区精品国产| av资源站一区| 国产精品精品国产色婷婷| 久久国产一区二区| 国产91精品露脸国语对白| 1024国产精品| 欧美亚洲愉拍一区二区| 91伊人久久大香线蕉| 一区二区在线电影| 欧美人牲a欧美精品| 91美女视频网站| 香蕉成人伊视频在线观看| 欧美一区二区三区四区在线观看| 欧美日本精品| 日韩国产成人精品| 久久久久99精品国产片| 欧美亚洲一区二区三区| 国内成人免费视频| 国产精品你懂的在线欣赏| 在线看国产日韩| 色综合天天综合网天天狠天天| 一区二区三区不卡视频| 欧美三级资源在线| 欧美久久一级| 视频一区免费在线观看| www国产精品av| 美女网站久久| 99免费精品在线观看| 午夜精品在线看| 久久久精品综合| 色婷婷综合久久| 91蜜桃免费观看视频| 亚洲成人www| 久久久噜噜噜久久中文字幕色伊伊 | 99久久99久久综合| 日日夜夜精品视频免费| 久久久影视传媒| 一本久道中文字幕精品亚洲嫩| 91丝袜高跟美女视频| 日韩av中文字幕一区二区三区| 久久日韩粉嫩一区二区三区| 玖玖国产精品视频| 国产偷国产偷精品高清尤物 | 国产精品女主播在线观看| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | 九一九一国产精品| 亚洲人妖av一区二区| 欧美一区二区不卡视频| 亚洲女优在线| 欧美不卡高清| 精品一区二区三区香蕉蜜桃| 亚洲桃色在线一区| 日韩欧美国产一区二区在线播放| 国产精品一区毛片| 91女人视频在线观看| 狠狠色狠狠色综合系列| 亚洲尤物视频在线| 久久久久久**毛片大全| 欧美喷潮久久久xxxxx| 国产精品日本| 欧美日韩一区在线观看视频| 国产在线精品一区在线观看麻豆| 一区二区免费看| 久久久久久久久久久电影| 欧美日韩一卡二卡三卡| 国产伦精品一区二区三区高清版 | 色婷婷av久久久久久久| 影音先锋中文字幕一区二区| 丁香激情综合国产| 免费成人在线影院| 香蕉影视欧美成人| 亚洲欧美日韩在线播放| 国产丝袜在线精品| 欧美成人精品福利| 欧美日韩视频在线一区二区| 久久成人精品| 在线日韩av| 欧美日韩一区在线视频| 高清不卡在线观看| 国产在线一区观看| 免费精品视频在线| 亚洲国产一区在线观看| 亚洲久本草在线中文字幕| 国产精品美女久久福利网站| wwww国产精品欧美| 日韩欧美一区二区免费| 精品视频在线免费| 色伊人久久综合中文字幕| 国产欧美日韩综合一区在线播放| 欧美精品啪啪| 欧美一区视频| 91丨九色porny丨蝌蚪| 波多野结衣精品在线| 国产高清成人在线| 国内成人精品2018免费看| 老司机精品视频一区二区三区| 日韩精品一卡二卡三卡四卡无卡| 亚洲电影欧美电影有声小说| 亚洲精品国产高清久久伦理二区| 成人免费在线视频观看| 国产精品伦理一区二区| 国产精品久久久久久一区二区三区 | 欧美视频在线不卡| 欧洲中文字幕精品| 久久先锋影音| 日本韩国一区二区三区视频| 老司机午夜精品视频| 老牛国产精品一区的观看方式| 美女精品在线观看| 一本色道久久加勒比精品| 91国偷自产一区二区使用方法| 麻豆91精品| 噜噜噜91成人网| 午夜亚洲性色视频| 欧美亚洲一级| 激情六月综合| 国产一区视频观看| 韩国av一区| 国产综合久久| 激情综合自拍| 在线观看福利一区| 国产欧美短视频| 性欧美xxxx大乳国产app| 亚洲在线电影| 一本一道综合狠狠老| 久久久久久久久久久一区 | 欧美黄色一区| 一区在线播放| 国产三区精品| 久久精品一区二区国产| 欧洲一区二区三区在线| 欧美久久一二区|