婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > MySQL學(xué)習(xí)記錄之KEY分區(qū)引發(fā)的血案

MySQL學(xué)習(xí)記錄之KEY分區(qū)引發(fā)的血案

熱門標(biāo)簽:申請外呼電話線路 南通自動外呼系統(tǒng)軟件 廣東人工電話機(jī)器人 湖南人工外呼系統(tǒng)多少錢 信陽穩(wěn)定外呼系統(tǒng)運營商 百度地圖圖標(biāo)標(biāo)注中心 石家莊電商外呼系統(tǒng) 日照旅游地圖標(biāo)注 芒果電話機(jī)器人自動化

需求背景

業(yè)務(wù)表tb_image部分?jǐn)?shù)據(jù)如下所示,其中id唯一,image_no不唯一。image_no表示每個文件的編號,每個文件在業(yè)務(wù)系統(tǒng)中會生成若干個文件,每個文件的唯一ID就是字段id:

業(yè)務(wù)表tb_image的一些情況如下:

  • 根據(jù)image_no查詢和根據(jù)id查詢;
  • 存量數(shù)據(jù)2kw;
  • 日增長4w左右;
  • 日查詢量20w左右;
  • 非ToC系統(tǒng),所以并發(fā)的天花板可見;

方案選擇

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

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

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

性能測試

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

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

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

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

問題思考

我們再來回想一下KEY分區(qū)的原理: 通過MySQL內(nèi)置hash算法對分片鍵計算hash值后再對分區(qū)數(shù)取模 。這個原理也可以從MySQL官網(wǎng)找到,請戳鏈接: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相關(guān)的變量。

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

/**
 Calculate part_id for (SUB)PARTITION BY KEY
 @param file        Handler 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
*/
inline
static uint32 get_part_id_key(handler *file,
               Field **field_array,
               uint num_parts,
               longlong *func_value)
{
 DBUG_ENTER("get_part_id_key");
 // 計算分區(qū)字段的hash值
 *func_value= file->calculate_key_hash_value(field_array);
 // 對分區(qū)數(shù)取模
 DBUG_RETURN((uint32) (*func_value % num_parts));
}

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

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

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

  1. 如果設(shè)置40,64,128等偶數(shù)個分區(qū)數(shù)(PARTITIONS 64),會導(dǎo)致編號為奇數(shù)的分區(qū)(p1, p3, p5, p7, … p2n-1)完全插不進(jìn)數(shù)據(jù);
  2. 如果設(shè)置63,121(PARTITIONS 63)這種奇數(shù)但非質(zhì)數(shù)個分區(qū)數(shù),所有分區(qū)都會有數(shù)據(jù),但是不均勻;
  3. 如果設(shè)置137,31這種質(zhì)數(shù)個分區(qū)數(shù)(PARTITIONS 137),所有分區(qū)都會有數(shù)據(jù),并且非常均勻;

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

總結(jié)回顧

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

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

到此這篇關(guān)于MySQL學(xué)習(xí)記錄之KEY分區(qū)引發(fā)的血案的文章就介紹到這了,更多相關(guān)MySQL KEY分區(qū)血案內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • MySQL分庫分表與分區(qū)的入門指南
  • python 實現(xiàn)mysql自動增刪分區(qū)的方法
  • MySql分表、分庫、分片和分區(qū)知識深入詳解
  • Mysql臨時表及分區(qū)表區(qū)別詳解
  • 詳解MySQL分區(qū)表
  • MySQL最佳實踐之分區(qū)表基本類型
  • MySQL分區(qū)表的最佳實踐指南
  • MySql分表、分庫、分片和分區(qū)知識點介紹
  • MySQL分表和分區(qū)的具體實現(xiàn)方法
  • MySQL分區(qū)表的正確使用方法
  • MySQL高級特性——數(shù)據(jù)表分區(qū)的概念及機(jī)制詳解

標(biāo)簽:合肥 阿里 呼和浩特 公主嶺 沈陽 天津 惠州 牡丹江

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《MySQL學(xué)習(xí)記錄之KEY分區(qū)引發(fā)的血案》,本文關(guān)鍵詞  MySQL,學(xué)習(xí),記錄,之,KEY,分區(qū),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《MySQL學(xué)習(xí)記錄之KEY分區(qū)引發(fā)的血案》相關(guān)的同類信息!
  • 本頁收集關(guān)于MySQL學(xué)習(xí)記錄之KEY分區(qū)引發(fā)的血案的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲欧美在线视频观看| 色www精品视频在线观看| 久久久久久久国产精品影院| 色悠久久久久综合欧美99| 青青青伊人色综合久久| 亚洲成人一区在线| 亚洲成av人片一区二区三区| 香蕉乱码成人久久天堂爱免费| 亚洲色大成网站www久久九九| 69堂精品视频| 久久久亚洲高清| 国产精品久久久久久妇女6080| 国产欧美日韩精品一区| 国产精品国产三级国产普通话蜜臀 | gogogo免费视频观看亚洲一| 麻豆精品一区二区综合av| 亚洲第一激情av| 麻豆精品一二三| 国产精品99久久久久久宅男| 91日韩精品一区| 欧美大片免费久久精品三p| 国产日韩精品久久久| 中文字幕制服丝袜成人av| 亚洲国产电影在线观看| 亚洲人成网站在线| 亚洲已满18点击进入久久| 日本久久精品电影| 欧美日本免费一区二区三区| 国产女人aaa级久久久级| 亚洲线精品一区二区三区八戒| 久久成人综合网| 在线播放欧美女士性生活| 国产精品九色蝌蚪自拍| 久久成人羞羞网站| 精品人在线二区三区| 美腿丝袜在线亚洲一区| 色老汉av一区二区三区| 国产精品久久久久久久裸模| 成人va在线观看| 亚洲麻豆国产自偷在线| 欧美亚洲日本一区| 午夜视频久久久久久| 欧美日韩国产另类一区| 五月综合激情婷婷六月色窝| 欧美三电影在线| 秋霞午夜av一区二区三区| 91精品国产91久久久久久最新毛片| 午夜视频一区二区| 日韩精品一区二区三区中文不卡 | 亚洲色图欧洲色图婷婷| 91麻豆国产香蕉久久精品| 香蕉影视欧美成人| 国产调教视频一区| 欧美在线免费视屏| 国产在线国偷精品产拍免费yy| 欧美激情中文不卡| 欧美日韩精品一区二区三区| 久久精品国产色蜜蜜麻豆| 中文成人av在线| 免费三级欧美电影| 五月激情六月综合| 精品国产乱码久久久久久夜甘婷婷 | 色诱亚洲精品久久久久久| 婷婷一区二区三区| 亚洲你懂的在线视频| 精品欧美乱码久久久久久1区2区| 国产老妇另类xxxxx| 亚洲电影一级黄| 午夜精品一区二区三区电影天堂| 欧美日韩dvd在线观看| 成人激情小说乱人伦| 久久aⅴ国产欧美74aaa| 亚洲一区在线电影| 久久久美女艺术照精彩视频福利播放| 91丨九色丨尤物| 国产真实乱对白精彩久久| 亚洲影视资源网| 亚洲欧美视频在线观看| 精品福利二区三区| 欧美一个色资源| 日韩欧美一级精品久久| 在线一区二区视频| 99久久精品久久久久久清纯| 国产成人aaa| 国产一区二区三区精品视频| 日韩成人精品视频| 午夜精品福利一区二区三区av | 精品一区二区三区在线观看国产| 在线欧美小视频| 欧美精品1区2区3区| 欧美日韩亚洲丝袜制服| 欧美日韩国产影片| 91精品国产色综合久久ai换脸| 制服丝袜亚洲色图| 亚洲欧美电影院| 亚洲精品在线三区| 国产精品美女久久久久久久久| 久久久久久免费网| 伊人婷婷欧美激情| 蜜臀va亚洲va欧美va天堂| 日韩成人一区二区三区在线观看| 美国三级日本三级久久99| 国产精品99久久久久久似苏梦涵 | 亚洲欧美激情一区二区| 最新热久久免费视频| 亚洲国产精品一区二区尤物区| 色香色香欲天天天影视综合网| 欧美色倩网站大全免费| 日韩欧美另类在线| 一区二区三区国产豹纹内裤在线| 亚洲二区在线视频| 亚洲最色的网站| 国产成人av一区二区三区在线观看| youjizz久久| 久久精品人人做人人综合| 亚洲午夜精品网| av电影一区二区| 国产精品国模大尺度视频| 黄一区二区三区| 欧美日韩一区二区电影| 欧美成人猛片aaaaaaa| 亚洲女人小视频在线观看| 国产成人在线色| 2023国产精品自拍| 久久成人精品无人区| 26uuu亚洲婷婷狠狠天堂| 免费在线观看日韩欧美| 日韩一区二区免费在线观看| 日本成人在线网站| 69久久夜色精品国产69蝌蚪网| 亚洲一区二区三区四区不卡| 欧美亚一区二区| 免费观看成人av| 久久久久久久久久久黄色| 成人国产免费视频| 国产精品久久久久影院老司| 972aa.com艺术欧美| 亚洲成人自拍偷拍| 日韩欧美一区二区在线视频| 极品销魂美女一区二区三区| 日韩欧美国产三级| 成人黄色电影在线| 理论电影国产精品| 亚洲高清一区二区三区| 精品国产sm最大网站免费看| av亚洲精华国产精华| 日本欧洲一区二区| 亚洲精品免费在线观看| 欧美精品一区在线观看| 99re热视频这里只精品| 国产在线国偷精品产拍免费yy | 高清不卡一区二区在线| 国产欧美一区二区精品秋霞影院| 成av人片一区二区| 久久精品国产999大香线蕉| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆 | 亚洲综合区在线| 日韩精品中文字幕一区| 色素色在线综合| 91免费在线看| 99视频在线精品| 国产一区二区在线观看视频| 日韩高清不卡在线| 亚洲国产精品人人做人人爽| 亚洲蜜臀av乱码久久精品| 国产欧美一区在线| 亚洲视频在线观看三级| 日本一区二区免费在线 | 7777精品久久久大香线蕉| 91在线精品一区二区| 99视频精品免费视频| 成人精品国产免费网站| 91丝袜美腿高跟国产极品老师| 亚洲一区中文在线| 蜜臀av亚洲一区中文字幕| 日本视频中文字幕一区二区三区| 亚洲国产日韩一级| 亚洲aaa精品| 亚洲午夜在线观看视频在线| 五月天亚洲婷婷| 国产成人精品亚洲777人妖| av午夜精品一区二区三区| 色欧美88888久久久久久影院| 色嗨嗨av一区二区三区| 91麻豆精东视频| 亚洲3atv精品一区二区三区| 日韩av电影天堂| 欧美中文字幕一区| 国产精品国产a| 久久国产精品区| 成人性色生活片| 3d成人动漫网站| 国产精品女同一区二区三区| 亚洲一区二区三区四区五区黄| 国内精品国产成人国产三级粉色| 欧美无砖砖区免费| 1000部国产精品成人观看| 蜜臀99久久精品久久久久久软件| 成人免费视频视频| 精品免费国产一区二区三区四区|