磁碟、mysql、redis、hana 的故事!
我們所接觸到的事物,都有他的同類存在,若有一個同類脫穎而出都可以算是一次革命吧(隨口的,別在意這段話)。硬體裝置的突破,如cpu,記憶體條等;資料的管理技術:人工表管理資料,機器卡片物理管理資料,磁碟管理資料,磁碟管理資料等等,有的因為需求增加,現狀不滿足需求時,就會被動的去更新升級,有的是為了滿足需求更大的需求,也有的提前去挖掘需求,還有的是為了學術研究,突破,探索更深層次的事物。那跟當前所講的故事有啥關係哦。別急,別急,別急,容客官我慢慢述說。
磁碟對於資料儲存的重要性
我們知道電腦有硬碟的組成,我們的檔案,程式等資料放在硬碟或軟盤中,那我們要拿硬碟或軟盤中的某個檔案的資料時,如在一個檔案中搜尋MmoMartin的字串,就會涉及到磁碟的定址(定址比較好理解,就比如外賣小哥接到外賣單好,帶著外賣送到指定地點,這個客戶的下單地址就是外賣小哥要找的地址,也就是磁碟的定址,然後等待對方領外賣,完成送外賣操作。這個操作涉及兩個時間段:第一個時間段是外賣小哥送達的時間耗時,第二個時間段是等待客戶領外賣的時間耗時。磁碟的定址的響應時間=定址時間+等待時間,一般情況下磁碟的定址是ms級別,記憶體的定址為ns級別,磁碟的吞吐一般在幾百M,快的可以達到幾個G,想深入瞭解的可以去搜尋下磁碟原理)
回到檔案搜尋MmoMartin的字串,當你開啟一個大小為10G,百G的文字檔案時,若你用txt文件開啟的話,開啟很卡(大家應該遇見過吧),因為其中涉及到磁碟的定址與吞吐,所以慢很正常,開啟都困難了何況搜尋。為了解決這個問題,有多種方案,如: 將很大的檔案拆分成小檔案儲存。以檔案為100G為例,若每個檔案儲存512M的話,需要200個檔案,也就是你需要開啟200個檔案去搜尋MmoMartin這個字串,這種方式比起將100G堆在一個檔案來說,磁碟定址的響應時間是可以縮短。是不是有點麻煩哦,那有沒有更加簡便的方法去實現呢?以下以mysql為例。
mysql儲存資料
嗯,mysql資料庫是可以讓查詢資料更加快的。那為啥建立索引可以讓他快呢?
先說快吧,建立索引,可以讓資料搜尋快,其實,mysql的底層實現也是將一個表的資料儲存在類似盒子的東西里面,mysql官方稱datapage,我們就叫它盒子,盒子大小為4KB或8KB或者16KB等(預設盒子大小都為4KB)。首先將表的資料按照切分成盒子這樣大小的資料,很多個,然後放進盒子(這個步驟我們叫它--分流),若單單這樣操作跟磁碟操作一樣,搜尋MmoMartin還是得遍歷啊,對吧,速度也不見長。為了解決讓其快,他將對應的列的資料也拿出來,也放到盒子去,該列所處的盒子會記錄該資料對應分流的哪個盒子,是不是跟key-value很像哦。這樣子是不是可以根據所處的索引列的盒子直接拿分流的盒子了,不用一一去遍歷(拆)分流的盒子了,直接取出分流的盒子,遍歷該盒子的資料就OK了。增加、刪除、修改需要重新建立新的索引的盒子,會導致索引不起作用,這也就是大家常常說增加、刪除、修改會讓索引不起作用。這只是建立了類似key-value,理想情況下,無論分流的資料有多大,只要索引的盒子不被破壞,查詢速度也是那樣快的。那能不能讓mysql更加快呢。
進一步優化mysql的索引
由於索引列的資料也是放在盒子的,為了在查詢索引的盒子的速度再提升,就有了B+樹的出現了,很多部落格也說了為啥mysql的索引是B+樹的原因,大家可以去看看。mysql的索引機制如圖:
mysql查詢MmoMartin字串,首先通過B+樹找到索引的盒子,然後通過盒子直接去找分流的盒子,然後遍歷分流盒子的資料,由於mysql是行式儲存(因為每列都帶有資料型別,建表的列時需要指定大小,如下圖),按照每列指定的的大小進行偏移就可以將帶有MmoMartin的該行資料讀取,輸出,這樣就提升了查詢的能力,這也是設計資料庫時為啥要儘量的設計列欄位的大小合適的原因,大的在偏移過程中是需要時間的。若B+樹找索引盒子的演算法是在記憶體進行的,我覺得可以提高一個檔次了。既然記憶體辣麼牛逼,那有沒有直接在記憶體操作的資料庫哦?嗯 ,答案是有的
我是最貴的資料庫--HANA
嗯,確實是存在記憶體的資料庫,為了讓資料讀寫更快以及知道記憶體的讀寫時ns級別的,有個公司發明了一個資料庫,該資料庫是直接在記憶體執行的,那就是HANA,但是造價相當相當的貴哦,記憶體最小貌似2T,資料的操作無需放到硬碟,直接儲存在記憶體,使用者可以直接對大量實時業務資料進行查詢和分析,而不需要對業務資料進行建模、聚合,被稱為HANA(High-Performance Analytic Appliance)高效能分析裝置,他們的裝置一般都是整包出售的,ERP系統,伺服器等,售價大概在幾個億吧。既然這麼貴,很多人用不起啊,那有沒有一個工具也是記憶體讀寫資料,又便宜的資料儲存的工具哦,嗯,也有,可見人腦因為需求,變得多聰明哦。
我開源,我也是使用記憶體的儲存資料的--Redis
由於mysql有時太慢,對於實時的資料可能速度跟不上,hana又太貴了,有人就發明了redis這個工具,也正是redis的開源,免費,高併發,速度快,才得以生存。當你的計算部分需要高速執行時,可以交給redis操作,這樣你的程式可以變得更快。redis是直接佔用記憶體,計算的操作也是記憶體,速度也就快了。當併發情況下,請求同一資源時,mysql需要開啟事務,結束事務操作(事務鎖,告訴其他人該shi坑我佔用了,其他人等待),才能保證資料的準確性,但是redis不需要,直接在記憶體操作,沒有涉及鎖不鎖的問題,資料直接更新,下個人拿的資料就是最新的資料,速度上也就快了。redis可以單獨拎出來講。
以上有說的不對的地方請指正,謝謝!
相關文章
- Redis持久化背後的故事Redis持久化
- MySQL 磁碟 IO 過高MySql
- MYSQL資料庫與Emoji表情的故事MySql資料庫
- MYSQL 主鍵的那些 “有意思” 故事MySql
- mysql資料庫磁碟io高的排查MySql資料庫
- Redis 寫磁碟出錯 Cannot allocate memoryRedis
- SAP HANA,S/4HANA 和 SAP BTP 的辨析
- 還不懂Redis?看完這個故事就明白了!Redis
- KV上MySQL與Redis的PKMySqlRedis
- 一文深度揭祕Redis的磁碟持久化機制Redis持久化
- MySQL之磁碟I/O過高排查MySql
- 一次詭異的MySQL問題處理故事MySql
- 談談mysql和redis的區別MySqlRedis
- 使用Redis做為MySQL的快取RedisMySql快取
- MySQL 與 Redis 快取的同步方案MySqlRedis快取
- MySQL 04-EMOJI 表情與 UTF8MB4 的故事MySql
- linux檢視mysql佔用磁碟空間LinuxMySql
- 談談Redis快取中MySQL的資料如何與Redis同步Redis快取MySql
- 探索Redis與MySQL的雙寫問題RedisMySql
- 跨Mysql、Redis、Mongo的分散式事務MySqlRedisGo分散式
- MySQL 5.7的表刪除資料後的磁碟空間釋放MySql
- MySQL 可以壓縮或回收磁碟空間嗎MySql
- SAP HANA 中的 SLT 簡介
- MySQL探祕(四):InnoDB的磁碟檔案及落盤機制MySql
- Mysql InnoDB刪除資料後釋放磁碟空間的方法MySql
- mysql資料同步至redisMySqlRedis
- 【180414】分散式鎖(redis/mysql)分散式RedisMySql
- 我的故事
- “安”的故事
- HTTPS 的故事HTTP
- Hadoop的故事Hadoop
- mysql與redis的區別與使用場景MySqlRedis
- dolphinscheduler新增hana支援
- 怎樣在磁碟上查詢MySQL表的大小?這裡有答案MySql
- 使用docker安裝mysql和redisDockerMySqlRedis
- 聊聊Mysql索引和redis跳錶MySql索引Redis
- docker 安裝mysql redis activemq rabbitmqDockerMySqlRedisMQ
- Mysql和Redis資料同步策略MySqlRedis