太厲害了!華為大牛終于把MySQL講的明明白白(基礎(chǔ)+優(yōu)化+架構(gòu))

愛因斯坦說過“耐心和恒心總會得到報酬的”,我也一直把這句話當做自己的座右銘,這句箴言在今年也徹底在“我”身上實現(xiàn)了。
每一個程序員都擁有一座大廠夢,我也不例外,去年面試阿里,竟然被MySQL問倒了,很多相關(guān)性的問題都沒有答上來,才2面就涼涼了。為面試做了很多準備,收集很多關(guān)于MySQL面試題
MySQL有哪些特性?
使用C和C++編寫,并使用了多種編譯器進行測試,保證源代碼的可移植性
支持AIX、FreeBSD、HP-UX、Linux、MacOS、Novell Netware、OpenBSD、OS/2 Wrap、Solaris、Windows等多種操作系統(tǒng)
為多種編程語言提供了API。這些編程語言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。
支持多線程,充分利用CPU資源
化的SQL查詢算法,有效地提高查詢速度
既能夠作為一個單獨的應用程序應用在客戶端服務器網(wǎng)絡環(huán)境中,也能夠作為一個庫而嵌入到其他的軟件中提供多語言支持,常見的編碼如中文的GB 2312、BIG5,日文的Shift_JIS等都可以用作數(shù)據(jù)表名和數(shù)據(jù)列名
提供TCP/IP、ODBC和JDBC等多種數(shù)據(jù)庫連接途徑
提供用于管理、檢查、優(yōu)化數(shù)據(jù)庫操作的管理工具
可以處理擁有上千萬條記錄的大型數(shù)據(jù)庫
走進MySQL的世界
1、MySQL 性能優(yōu)化的 21 個最佳實踐
為查詢緩存優(yōu)化你的查詢
EXPLAIN 你的 SELECT 查詢
當只要一行數(shù)據(jù)時使用 LIMIT 1
為搜索字段建索引
在 Join 表的時候使用相當類型的例,并將其索引
千萬不要 ORDER BY RAND()
避免 SELECT *
永遠為每張表設置一個 ID
使用 ENUM 而不是 VARCHAR
從 PROCEDURE ANALYSE() 取得建議
盡可能的使用 NOT NULL
Prepared Statements
無緩沖的查詢
把 IP 地址存成 UNSIGNED INT
固定長度的表會更快
垂直分割
拆分大的 DELETE 或 INSERT 語句
越小的列會越快
選擇正確的存儲引擎
選擇正確的存儲引擎
小心“永久鏈接”

2、MySQL面試題總結(jié)
之前的阿里面試題都有做總結(jié),具體面試題內(nèi)容整理成了文檔,本文是針對MySQL系列的,所以下面只展示了自己第一次面試阿里時被吊打問到的一些MySQL難題,下面是今年面試阿里遇到MySQL的題目。
2.1.其他專題內(nèi)容(含答案)的文檔資料,私信我【面試】即可領(lǐng)取。
請解釋關(guān)系型數(shù)據(jù)庫概念及主要特點?
請說出關(guān)系型數(shù)據(jù)庫的典型產(chǎn)品、特點及應用場景?
請詳細描述 SQL 語句分類及對應代表性關(guān)鍵字。
什么是 MySQL 多實例,如何配置 MySQL 多實例?
如何加強 MySQL 安全,請給出可行的具體措施?
誤操作執(zhí)行了一個 drop 庫 SQL 語句,如何完整恢復?
詳述 MySQL 主從復制原理及配置主從的完整步驟。
MySQL 如何實現(xiàn)雙向互為主從復制,并說明應用場景?
MySQL 如何實現(xiàn)級聯(lián)同步,并說明應用場景?
MySQL 主從復制故障如何解決?
2.2.MySQL55道面試專題你能答出多少?
一張表,里面有 ID 自增主鍵,當 insert 了 17 條記錄之后,刪除了第 15,16,17 條記錄,再把 Mysql 重啟,再 insert 一條記錄,這條記錄的 ID 是 18 還是 15 ?
Mysql 的技術(shù)特點是什么?
Heap表是什么?
Mysql 服務器默認端口是什么?
與 Oracle 相比,Mysql 有什么優(yōu)勢?
如何區(qū)分 FLOAT 和 DOUBLE?
區(qū)分 CHAR_LENGTH 和 LENGTH?
請簡潔描述 Mysql 中 InnoDB 支持的四種事務隔離級別名稱,以及逐級之間的區(qū)別?
在 Mysql 中 ENUM 的用法是什么?
如何定義 REGEXP?
CHAR 和 VARCHAR 的區(qū)別?
列的字符串類型可以是什么?
如何獲取當前的 Mysql 版本?
Mysql 中使用什么存儲引擎?
Mysql 驅(qū)動程序是什么?
TIMESTAMP 在 UPDATE CURRENT_TIMESTAMP 數(shù)據(jù)類型上做什么?
主鍵和候選鍵有什么區(qū)別?
如何使用 Unix shell 登錄 Mysql?
myisamchk 是用來做什么的?
MYSQL 數(shù)據(jù)庫服務器性能分析的方法命令有哪些?
如何控制 HEAP 表的最大尺寸?
MyISAM Static 和 MyISAM Dynamic 有什么區(qū)別?
federated 表是什么?
如果一個表有一列定義為 TIMESTAMP,將發(fā)生什么?
列設置為 AUTO INCREMENT 時,如果在表中達到最大值,會發(fā)生什么情況?
怎樣才能找出最后一次插入時分配了哪個自動增量?
你怎么看到為表格定義的所有索引?
LIKE 聲明中的%和_是什么意思?
如何在 Unix 和 Mysql 時間戳之間進行轉(zhuǎn)換?
列對比運算符是什么?
我們?nèi)绾蔚玫绞懿樵冇绊懙男袛?shù)?
Mysql 查詢是否區(qū)分大小寫?
LIKE 和 REGEXP 操作有什么區(qū)別?
BLOB 和 TEXT 有什么區(qū)別?
mysql_fetch_array 和 mysql_fetch_object 的區(qū)別是什么?
我們?nèi)绾卧?mysql 中運行批處理模式?
MyISAM 表格將在哪里存儲,并且還提供其存儲格式?
Mysql 中有哪些不同的表格?
ISAM 是什么?
InnoDB 是什么?
Mysql 如何優(yōu)化 DISTINCT?
如何輸入字符為十六進制數(shù)字?
如何顯示前 50 行?
可以使用多少列創(chuàng)建索引?
NOW()和 CURRENT_DATE()有什么區(qū)別?
什么樣的對象可以使用 CREATE 語句創(chuàng)建?
Mysql 表中允許有多少個 TRIGGERS?
什么是非標準字符串類型?
什么是通用 SQL 函數(shù)?
解釋訪問控制列表
MYSQL 支持事務嗎?
mysql 里記錄貨幣用什么字段類型好
MYSQL 數(shù)據(jù)表在什么情況下容易損壞?
mysql 有關(guān)權(quán)限的表都有哪幾個?
Mysql 中有哪幾種鎖?
3、MySQL 性能調(diào)優(yōu)與架構(gòu)設計
基礎(chǔ)篇:
MySQL基本介紹
MySQL架構(gòu)組成
MySQL存儲引擎簡介
MySQL安全管理
MySQL備份與恢復

性能優(yōu)化篇:
影響MySQLServer性能的相關(guān)因素
MySQL數(shù)據(jù)庫鎖定機制
MySQL數(shù)據(jù)庫Query的優(yōu)化
MySQL數(shù)據(jù)庫Schema設計的性能優(yōu)化
MySQLServer性能優(yōu)化
常用存儲引擎優(yōu)化

架構(gòu)設計篇:
MySQL可擴展設計的基本原則
可擴展性設計之MySQLReplication
可擴展性設計之數(shù)據(jù)切分
可擴展性設計之Cache與Search的..
MySQLCluster
高可用設計之思路及方案
高可用設計之MySQL監(jiān)控
MySQL架構(gòu)與歷史

和其他數(shù)據(jù)庫系統(tǒng)相比,MySQL有點與眾不同,它的架構(gòu)可以在多種不同場景中應用并發(fā)揮好的作用,但同時也會帶來-點選擇上的困難。MySQL并不完美,卻足夠靈活,能夠適應高要求的環(huán)境,例如Web類應用。同時,MySQL既可以嵌入到應用程序中,也可以支持數(shù)據(jù)倉庫、內(nèi)容索引和部署軟件、高可用的冗余系統(tǒng)、在線事務處理系統(tǒng)(OLTP)等各種應用類型。
轉(zhuǎn)發(fā)+關(guān)注后留意私信回復【架構(gòu)書籍】即可免費領(lǐng)取史上最全MySQL實戰(zhàn)文檔
服務器性能剖析

在我們的技術(shù)咨詢生涯中,最常碰到的三個性能相關(guān)的服務請求是:如何確認服務器是否達到了性能最佳的狀態(tài)、找出某條語句為什么執(zhí)行不夠快,以及診斷被用戶描述成“停頓"、“堆積"或者“卡死"的某些間歇性疑難故障。本章將主要針對這三個問題做出解答。我們將提供- - 些工具和技巧來優(yōu)化整機的性能、優(yōu)化單條語句的執(zhí)行速度,以及診斷或者解決那些很難觀察到的問題(這些問題用戶往往很難知道其根源,有時候甚至都很難察覺到它的存在)。
查詢性能優(yōu)化

前面是介紹了如何設計最優(yōu)的庫表結(jié)構(gòu)、如何建立最好的索引,這些對于高性能來說是必不可少的。但這些還不夠一還需 要合理的設計查詢。如果查詢寫得很糟糕,即使庫表結(jié)構(gòu)再合理、索引再合適,也無法實現(xiàn)高性能。
MySQL高級特性

MySQL從5.0和5.1版本開始引入了很多高級特性,例如分區(qū)、觸發(fā)器等,這對有其他關(guān)系型數(shù)據(jù)庫使用背景的用戶來說可能并不陌生。這些新特性吸引了很多用戶開始使用MySQL。不過,這些特性的性能到底如何,還需要用戶真正使用過才能知道。這里我們將為大家介紹,在真實的世界中,這些特性表現(xiàn)如何,而不是只簡單地介紹參考手冊或者宜傳材料.上的數(shù)據(jù)。
轉(zhuǎn)發(fā)+關(guān)注后留意私信回復【架構(gòu)書籍】即可免費領(lǐng)取史上最全MySQL實戰(zhàn)文檔
優(yōu)化服務器設置

這里我們將解釋為MySQL服務器創(chuàng)建一個靠譜的配置文件的過程。這是一個很繞的過程,有很多有意思的關(guān)注點和值得關(guān)注的思路。關(guān)注這些點很有必要,因為創(chuàng)建個好配置的最快方法不是從學習配置項開始,也不是從問哪個配置項應該怎么設置或者怎么修改開始,更不是從檢查服務器行為和詢問哪個配置項可以提升性能開始。
最好是從理解MySQL內(nèi)核和行為開始。然后可以利用這些知識來指導配置MySQL.最后,可以將想要的配置和當前配置進行比較,然后糾正重要并且有價值的不同之處。
轉(zhuǎn)發(fā)+關(guān)注后留意私信回復【架構(gòu)書籍】即可免費領(lǐng)取史上最全MySQL實戰(zhàn)文檔
復制

MySQL內(nèi)建的復制功能是構(gòu)建基于MySQL的大規(guī)模、高性能應用的基礎(chǔ),這類應用使用所謂的“水平擴展”的架構(gòu)。我們可以通過為服務器配置一個或多個備庫生1的方式來進行數(shù)據(jù)同步。復制功能不僅有利于構(gòu)建高性能的應用,同時也是高可用性、可擴展性、災難恢復、備份以及數(shù)據(jù)倉庫等工作的基礎(chǔ)。事實上,可擴展性和高可用性通常是相關(guān)聯(lián)的話題,我們會在接下來的三章詳細闡述。
轉(zhuǎn)發(fā)+關(guān)注后留意私信回復【架構(gòu)書籍】即可免費領(lǐng)取史上最全MySQL實戰(zhàn)文檔
可擴展的MySQL

在此將展示如何構(gòu)建-一個 基于MySQL的應用,并且當規(guī)模變得越來越龐大時,還能保證快速、高效并且經(jīng)濟。有些應用僅僅適用于--臺或少數(shù)幾臺服務器,那么哪些可擴展性建議是和這些應用相關(guān)的呢?大多數(shù)人從不會維護超大規(guī)模的系統(tǒng),井且通常也無法效仿在主流大公司所使用的策略。本章會涵蓋這- - 系列的策略。我們已經(jīng)建立或者協(xié)助建立了許多應用,包括從單臺或少量服務器的應用到使用上千臺服務器的應用。選擇一個合適的策略能夠大大地節(jié)約時間和金錢。MySQL經(jīng)常被批評很難進行擴展,有些情況下這種看法是正確的,但如果選擇正確的架構(gòu)并很好地實現(xiàn),就能夠非常好地擴展MySQL.但是擴展性并不是-一個很好理解的主題,所以我們先來理清- -些容易混淆的地方。
轉(zhuǎn)發(fā)+關(guān)注后留意私信回復【架構(gòu)書籍】即可免費領(lǐng)取史上最全MySQL實戰(zhàn)文檔
云端的MySQL

應用層優(yōu)化
如果在提高MySQL的性能上花費太多時間,容易使視野局限于MySQL本身,而忽略了用戶體驗?;剡^頭來看,也許可以意識到,或許MySQL已經(jīng)足夠優(yōu)化,對于用戶看到的響應時間而言,其所占的比重已經(jīng)非常之小,此時應該關(guān)注下其他部分了。這是個很不錯的觀點,尤其是對DBA而言,這是很值得去做的正確的事。但如果不是MySQL,那又是什么導致了問題呢?使用第3章提到的技術(shù),通過測量可以快速而準確地給出答案。如果能順著應用的邏輯過程從頭到尾來剖析,那么找到問題的源頭一般來說并不困難。有時,盡管問題在MySQL.上,也很容易在系統(tǒng)的另一部分得到解決。
備份和恢復
如果沒有提前做好備份規(guī)劃,也許以后會發(fā)現(xiàn)已經(jīng)錯失了- -些最佳的選擇。例如,在服務器已經(jīng)配置好以后,才想起應該使用LVM,以便可以獲取文件系統(tǒng)的快照一但這時已經(jīng)太遲了。在為備份配置系統(tǒng)參數(shù)時,可能沒有注意到某些系統(tǒng)配置對性能有著重要影響。如果沒有計劃做定期的恢復演練,當真的需要恢復時,就會發(fā)現(xiàn)并沒有那么順利。
MySQL用戶工具
MySQL服務器發(fā)行包中并沒有包含針對許多常用任務的工具,例如監(jiān)控服務器或比較不同服務器間數(shù)據(jù)的工具。幸運的是,Oracle 的商業(yè)版提供了- -些擴展工具,并且MySQL活躍的開源社區(qū)和第三方公司也提供了- -系列的工具,降低了自己“重復發(fā)明輪子”的需要。
總目錄

轉(zhuǎn)發(fā)+關(guān)注后留意私信回復【架構(gòu)書籍】即可免費領(lǐng)取史上最全MySQL實戰(zhàn)文檔
本文就是愿天堂沒有BUG給大家分享的內(nèi)容,大家有收獲的話可以分享下,想學習更多的話可以到微信公眾號里找我,我等你哦。
