原创 40講insert語句的鎖爲什麼這麼多

在上一篇文章中,我提到MySQL對自增主鍵鎖做了優化,儘量在申請到自增id以後,就釋放自增鎖。 因此,insert語句是一個很輕量的操作。不過,這個結論對於“普通的insert語句”纔有效。也就是說,還有些insert語句是屬於“

原创 面試volatile關鍵字時,我們應該具備哪些談資?

寫在前面 在 可見性有序性,Happens-before來搞定 文章中,happens-before 的原則之一: volatile變量規則 對一個 volatile 域的寫, happens-before 於任意後續對這個 v

原创 44講答疑文章(三):說一說這些好問題

在我看來,能夠幫我們擴展一個邏輯的邊界的問題,就是好問題。因爲通過解決這樣的問題,能夠加深我們對這個邏輯的理解,或者幫我們關聯到另外一個知識點,進而可以幫助我們建立起自己的知識網絡。 在工作中會問好問題,是一個很重要的能力。 經過

原创 45講自增id用完怎麼辦?

MySQL裏有很多自增的id,每個自增id都是定義了初始值,然後不停地往上加步長。雖然自然數是沒有上限的,但是在計算機裏,只要定義了表示這個數的字節長度,那它就有上限。比如,無符號整型(unsigned int)是4個字節,上限就

原创 43講要不要使用分區表

我經常被問到這樣一個問題:分區表有什麼問題,爲什麼公司規範不讓使用分區表呢?今天,我們就來聊聊分區表的使用行爲,然後再一起回答這個問題。 分區表是什麼? 爲了說明分區表的組織形式,我先創建一個表t: CREATE TABLE `t

原创 42講grant之後要跟着flushprivileges嗎

在MySQL裏面,grant語句是用來給用戶賦權的。不知道你有沒有見過一些操作文檔裏面提到,grant之後要馬上跟着執行一個flush privileges命令,才能使賦權語句生效。我最開始使用MySQL的時候,就是照着一個操作文

原创 39講自增主鍵爲什麼不是連續的

在第4篇文章中,我們提到過自增主鍵,由於自增主鍵可以讓主鍵索引儘量地保持遞增順序插入,避免了頁分裂,因此索引更緊湊。 之前我見過有的業務設計依賴於自增主鍵的連續性,也就是說,這個設計假設自增主鍵是連續的。但實際上,這樣的假設是錯的

原创 26講備庫爲什麼會延遲好幾個小時

在上一篇文章中,我和你介紹了幾種可能導致備庫延遲的原因。你會發現,這些場景裏,不論是偶發性的查詢壓力,還是備份,對備庫延遲的影響一般是分鐘級的,而且在備庫恢復正常以後都能夠追上來。 但是,如果備庫執行日誌的速度持續低於主庫生成日誌

原创 35講join語句怎麼優化

在上一篇文章中,我和你介紹了join語句的兩種算法,分別是Index Nested-Loop Join(NLJ)和Block Nested-Loop Join(BNL)。 我們發現在使用NLJ算法的時候,其實效果還是不錯的,比通過

原创 33講我查這麼多數據,會不會把數據庫內存打爆

我經常會被問到這樣一個問題:我的主機內存只有100G,現在要對一個200G的大表做全表掃描,會不會把數據庫主機的內存用光了? 這個問題確實值得擔心,被系統OOM(out of memory)可不是鬧着玩的。但是,反過來想想,邏輯備

原创 27講主庫出問題了,從庫怎麼辦

在前面的第24、25和26篇文章中,我和你介紹了MySQL主備複製的基礎結構,但這些都是一主一備的結構。 大多數的互聯網應用場景都是讀多寫少,因此你負責的業務,在發展過程中很可能先會遇到讀性能的問題。而在數據庫層解決讀性能問題,就

原创 28講讀寫分離有哪些坑

在上一篇文章中,我和你介紹了一主多從的結構以及切換流程。今天我們就繼續聊聊一主多從架構的應用場景:讀寫分離,以及怎麼處理主備延遲導致的讀寫分離問題。 我們在上一篇文章中提到的一主多從的結構,其實就是讀寫分離的基本結構了。這裏,我再

原创 24講MySQL是怎麼保證主備一致的

在前面的文章中,我不止一次地和你提到了binlog,大家知道binlog可以用來歸檔,也可以用來做主備同步,但它的內容是什麼樣的呢?爲什麼備庫執行了binlog就可以跟主庫保持一致了呢?今天我就正式地和你介紹一下它。 毫不誇張地說

原创 21講爲什麼我只改一行的語句,鎖這麼多

在上一篇文章中,我和你介紹了間隙鎖和next-key lock的概念,但是並沒有說明加鎖規則。間隙鎖的概念理解起來確實有點兒難,尤其在配合上行鎖以後,很容易在判斷是否會出現鎖等待的問題上犯錯。 所以今天,我們就先從這個加鎖規則開始

原创 20講幻讀是什麼,幻讀有什麼問題

在上一篇文章最後,我給你留了一個關於加鎖規則的問題。今天,我們就從這個問題說起吧。 爲了便於說明問題,這一篇文章,我們就先使用一個小一點兒的表。建表和初始化語句如下(爲了便於本期的例子說明,我把上篇文章中用到的表結構做了點兒修改)