原创 什麼是ObjectFactory?什麼是ObjectProvider?

ObjectFactory 接口定義 // 一個對象工廠 public interface ObjectFactory<T> { // 返回一個對象 T getObject() throws BeansExcep

原创 19講爲什麼我只查一行的語句,也執行這麼慢

一般情況下,如果我跟你說查詢性能優化,你首先會想到一些複雜的語句,想到查詢需要返回大量的數據。但有些情況下,“查一行”,也會執行得特別慢。今天,我就跟你聊聊這個有趣的話題,看看什麼情況下,會出現這個現象。 需要說明的是,如果MyS

原创 38講都說InnoDB好,那還要不要使用Memory引擎

我在上一篇文章末尾留給你的問題是:兩個group by 語句都用了order by null,爲什麼使用內存臨時表得到的語句結果裏,0這個值在最後一行;而使用磁盤臨時表得到的結果裏,0這個值在第一行? 今天我們就來看看,出現這個問

原创 31講誤刪數據後除了跑路,還能怎麼辦

今天我要和你討論的是一個沉重的話題:誤刪數據。 在前面幾篇文章中,我們介紹了MySQL的高可用架構。當然,傳統的高可用架構是不能預防誤刪數據的,因爲主庫的一個drop table命令,會通過binlog傳給所有從庫和級聯從庫,進而

原创 34講到底可不可以使用join

在實際生產中,關於join語句使用的問題,一般會集中在以下兩類: 我們DBA不讓使用join,使用join有什麼問題呢? 如果有兩個大小不同的表做join,應該用哪個表做驅動表呢? 今天這篇文章,我就先跟你說說join

原创 29講如何判斷一個數據庫是不是出問題了

我在第25和27篇文章中,和你介紹了主備切換流程。通過這些內容的講解,你應該已經很清楚了:在一主一備的雙M架構裏,主備切換隻需要把客戶端流量切到備庫;而在一主多從架構裏,主備切換除了要把客戶端流量切到備庫外,還需要把從庫接到新主庫

原创 22講MySQL有哪些“飲鴆止渴”提高性能的方法

不知道你在實際運維過程中有沒有碰到這樣的情景:業務高峯期,生產環境的MySQL壓力太大,沒法正常響應,需要短期內、臨時性地提升一些性能。 我以前做業務護航的時候,就偶爾會碰上這種場景。用戶的開發負責人說,不管你用什麼方案,讓業務先

原创 30講答疑文章(二):用動態的觀點看加鎖

在第20和21篇文章中,我和你介紹了InnoDB的間隙鎖、next-key lock,以及加鎖規則。在這兩篇文章的評論區,出現了很多高質量的留言。我覺得通過分析這些問題,可以幫助你加深對加鎖規則的理解。 所以,我就從中挑選了幾個有

原创 Kafka可靠性探究

Kafka中採用了多副本的機制, 這是大多數分佈式系統中慣用的手法, 以此來實現水平擴展、提供容災能力、提升可用性和可靠性等。我們對此可以引申出一系列的疑問:Kafka多副本之間如何進行數據同步,尤其是在發生異常時候的處理機制又是

原创 25講MySQL是怎麼保證高可用的

在上一篇文章中,我和你介紹了binlog的基本內容,在一個主備關係中,每個備庫接收主庫的binlog並執行。 正常情況下,只要主庫執行更新生成的所有binlog,都可以傳到備庫並被正確地執行,備庫就能達到跟主庫一致的狀態,這就是最

原创 41講怎麼最快地複製一張表

我在上一篇文章最後,給你留下的問題是怎麼在兩張表中拷貝數據。如果可以控制對源表的掃描行數和加鎖範圍很小的話,我們簡單地使用insert … select 語句即可實現。 當然,爲了避免對源表加讀鎖,更穩妥的方案是先將數據寫到外部文

原创 36講爲什麼臨時表可以重名

在上一篇文章中,我們在優化join查詢的時候使用到了臨時表。當時,我們是這麼用的: create temporary table temp_t like t1; alter table temp_t add index(b); i

原创 37講什麼時候會使用內部臨時表

在第16和第34篇文章中,我分別和你介紹了sort buffer、內存臨時表和join buffer。這三個數據結構都是用來存放語句執行過程中的中間數據,以輔助SQL語句的執行的。其中,我們在排序的時候用到了sort buffer

原创 15講答疑文章(一):日誌和索引相關問題

日誌相關問題 我在第2篇文章《日誌系統:一條SQL更新語句是如何執行的?》中,和你講到binlog(歸檔日誌)和redo log(重做日誌)配合崩潰恢復的時候,用的是反證法,說明了如果沒有兩階段提交,會導致MySQL出現主備數據不

原创 32講爲什麼還有kill不掉的語句

在MySQL中有兩個kill命令:一個是kill query +線程id,表示終止這個線程中正在執行的語句;一個是kill connection +線程id,這裏connection可缺省,表示斷開這個線程的連接,當然如果這個線程