Stories

Detail Return Return

SegmentFault 思否技術週刊 Vol.70 — 深入 MySQL 實戰 - Stories Detail

MySQL 是一種關聯數據庫管理系統,關聯數據庫將數據保存在不同的表中,而不是將所有數據放在一個大倉庫內。這樣就增加了速度並提高了靈活性。

MySQL 的 SQL “結構化查詢語言”,SQL 是用於訪問數據庫的最常用標準化語言。

MySQL 軟件採用了 GPL( GNU 通用公共許可證),由於其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,許多中小型網站為了降低網站總體擁有成本而選擇了 MySQL 作為網站數據庫。

本期技術週刊一起了解下 MySQL ,歡迎大家閲讀 ~

文章推薦

《10 分鐘教你寫一個數據庫》作者:艾小仙

今天教大家藉助一款框架快速實現一個數據庫,這個框架就是 Calcite,下面會帶大家通過兩個例子快速教會大家怎麼實現,一個是可以通過 SQL 語句的方式可以直接查詢文件內容,第二個是模擬 Mysql 查詢功能,以及最後告訴大家怎麼實現 SQL 查詢 Kafka 數據。

《學習 MySQL 必須掌握的 13 個關鍵字,你 get 了嗎?》作者:Java 架構師

三範式:

  • 第一範式:每個表的每一列都要保持它的原子性,也就是表的每一列是不可分割的;
  • 第二範式:在滿足第一範式的基礎上,每個表都要保持唯一性,也就是表的非主鍵字段完全依賴於主鍵字段;
  • 第三範式:在滿足第一範式和第二範式的基礎上,表中不能產生傳遞關係,要消除表中的冗餘性;

《Mysql 數據庫的批量插入或更新(Upsert)》作者:songofhawk

這個問題已經困擾我一段時間了,對於大量數據的插入或更新,批量操作肯定比每條記錄調用一次快得多,新數據可以用 insert 批量插入,老數據可以用 replace into 批量更新。但如果不知道數據是否存在(是否有唯一 key 和數據庫中已有記錄重複)想在一批數據庫中,插入新記錄,更新老記錄怎麼辦?

之前甚至想過封裝一個函數,先用 select ... in 批量查詢,然後分兩組插入和更新,但一方面通用性不佳,另一方面這不是一個原子操作,對於併發的情況,有可能查詢的時候記錄不存在,插入的時候就已經存在了。

仔細 google 了一下,才發現這種“存在 update,不存在 insert ”的動作,有個專有名詞,叫做“upsert”,相當形象。解決方案呢,不同數據庫各有自己的解決方案和方言,Mysql 叫做 on duplicate key update,PostgreSql 中叫做 on confict do update。

《Mysql 45 講關鍵知識》 作者:瘋狂小兵

是因為 Mysql 更新數據只寫到 redo 的 log 裏,達到閾值後會刷髒頁,佔用 CPU 資源。髒頁是指內存頁數據和磁盤頁數據不一致的情況。

發生場景

  • redolog 寫滿到閾值後,需將對應的內存頁數據刷到磁盤上。 需要儘量避免,否則所有更新操作都會被 hang 主
  • 內存不足,刷髒頁到磁盤上。常態,最需要關心的。
  • 資源空閒時,刷頁。也會時不時的刷下髒頁。資源空閒期刷髒頁,系統不會有壓力。
  • Mysql 正常關閉的時候,刷髒頁到磁盤。關閉時刷髒頁,正常操作,也不會關心性能。

影響性能的幾種情況

  • 一次刷髒頁太多。
  • 日誌寫滿了,更新全部堵塞住。

《為什麼説 MySQL 單錶行數不要超過 2000w ?》作者:碼猿技術專欄

作為在後端圈開車的多年老司機,是不是經常聽到過,“mysql 單表最好不要超過 2000w”,“單表超過 2000w 就要考慮數據遷移了”,“你這個表數據都馬上要到 2000w 了,難怪查詢速度慢”

這些名言民語就和 “羣裏只討論技術,不開車,開車速度不要超過 120 碼,否則自動踢羣”,只聽過,沒試過,哈哈。

下面我們就把車速踩到底,幹到 180 碼試試…….

《我操作 MySQL 的驚險一幕》作者:god23bin

情況:漏了某一個字段 X,需要將 A 表的這個字段列值更新到 B 表

條件:A 中的 id 字段的值等於 B表中的 id 字段的值 且 A 中的 name 字段的值等於 B 中 name 字段的值(條件為什麼這樣寫?)。

條件這樣寫主要是因為 表和表之間的關聯關係 可能有多個字段,此處只選二個字段,多個依此類推。

操作:

  • 一張表的數據插入到另一張表,可以這樣寫:
INSERT INTO 目標表(字段1, 字段2, ...) SELECT 字段1, 字段2, ... FROM 來源表 WHERE 條件;

問答推薦

  • MySQL 一千萬的數據量如何一秒內實現模糊搜索?
  • MySQL 語句求助?
  • MySQL 如何分組統計失敗率?
  • MySQL 生產環境數據表 10 億,不停服,想把自增 id int 改成 bigint 有什麼好的辦法嗎?
  • 單列索引建立的順序 會不會影響查詢速度?
  • MySQL 數據表新增一行記錄,會不會自動按主鍵自動排序插入,還是會排在最後?
  • 用於解決樹形結構存儲的閉包表,憑什麼能快速獲取某個節點的祖先節點/父節點/子節點?
  • MySQL 刪除數據的時候,會不會走索引?
  • MySQL 商品銷售情況統計查詢特別慢,如何優化呢?
  • MySQL 如何僅返回外表最新記錄符合特地條件的內表記錄?

# SegmentFault 技術週刊 #

「技術週刊」是社區特別推出的技術內容系列,一週一主題。

每週二更新,歡迎「關注」。大家也可以在評論處留言自己感興趣的主題,推薦主題相關的優秀文章。

如有問題可以添加小姐姐微信~

image.png

user avatar hu_qi Avatar mi2nagemao Avatar tonyyoung Avatar russell221 Avatar cloudyttt Avatar jiangpengfei_5ecce944a3d8a Avatar
Favorites 6 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.