愛因斯坦說過“耐心和恆心總會得到報酬的”,我也一直把這句話當做自己的座右銘,這句箴言在今年也徹底在“我”身上實現了。
每一個程序員都擁有一座大廠夢,我也不例外,去年面試阿里,竟然被MySQL問倒了,很多相關性的問題都沒有答上來,才2面就涼涼了。為面試做了很多準備,收集很多關於MySQL面試題
MySQL有哪些特性?
- 使用C和C++編寫,並使用了多種編譯器進行測試,保證源代碼的可移植性
- 支持AIX、FreeBSD、HP-UX、Linux、MacOS、Novell Netware、OpenBSD、OS/2 Wrap、Solaris、Windows等多種操作系統
- 為多種編程語言提供了API。這些編程語言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。
- 支持多線程,充分利用CPU資源
- 化的SQL查詢算法,有效地提高查詢速度
- 既能夠作為一個單獨的應用程序應用在客戶端服務器網絡環境中,也能夠作為一個庫而嵌入到其他的軟件中提供多語言支持,常見的編碼如中文的GB 2312、BIG5,日文的Shift_JIS等都可以用作數據表名和數據列名
- 提供TCP/IP、ODBC和JDBC等多種數據庫連接途徑
- 提供用於管理、檢查、優化數據庫操作的管理工具
- 可以處理擁有上千萬條記錄的大型數據庫
走進MySQL的世界
1、MySQL 性能優化的 21 個最佳實踐
- 為查詢緩存優化你的查詢
- EXPLAIN 你的 SELECT 查詢
- 當只要一行數據時使用 LIMIT 1
- 為搜索字段建索引
- 在 Join 表的時候使用相當類型的例,並將其索引
- 千萬不要 ORDER BY RAND()
- 避免 SELECT *
- 永遠為每張表設置一個 ID
- 使用 ENUM 而不是 VARCHAR
- 從 PROCEDURE ANALYSE() 取得建議
- 儘可能的使用 NOT NULL
- Prepared Statements
- 無緩衝的查詢
- 把 IP 地址存成 UNSIGNED INT
- 固定長度的表會更快
- 垂直分割
- 拆分大的 DELETE 或 INSERT 語句
- 越小的列會越快
- 選擇正確的存儲引擎
- 選擇正確的存儲引擎
- 小心“永久鏈接”
2、MySQL面試題總結
之前的阿里面試題都有做總結,具體面試題內容整理成了文檔,本文是針對MySQL系列的,所以下面只展示了自己第一次面試阿里時被吊打問到的一些MySQL難題,下面是今年面試阿里遇到MySQL的題目。
2.1.其他專題內容(含答案)的文檔資料,私信我【面試】即可領取。
- 請解釋關係型數據庫概念及主要特點?
- 請說出關係型數據庫的典型產品、特點及應用場景?
- 請詳細描述 SQL 語句分類及對應代表性關鍵字。
- 什麼是 MySQL 多實例,如何配置 MySQL 多實例?
- 如何加強 MySQL 安全,請給出可行的具體措施?
- 誤操作執行了一個 drop 庫 SQL 語句,如何完整恢復?
- 詳述 MySQL 主從複製原理及配置主從的完整步驟。
- MySQL 如何實現雙向互為主從複製,並說明應用場景?
- MySQL 如何實現級聯同步,並說明應用場景?
- MySQL 主從複製故障如何解決?
2.2.MySQL55道面試專題你能答出多少?
- 一張表,裡面有 ID 自增主鍵,當 insert 了 17 條記錄之後,刪除了第 15,16,17 條記錄,再把 Mysql 重啟,再 insert 一條記錄,這條記錄的 ID 是 18 還是 15 ?
- Mysql 的技術特點是什麼?
- Heap表是什麼?
- Mysql 服務器默認端口是什麼?
- 與 Oracle 相比,Mysql 有什麼優勢?
- 如何區分 FLOAT 和 DOUBLE?
- 區分 CHAR_LENGTH 和 LENGTH?
- 請簡潔描述 Mysql 中 InnoDB 支持的四種事務隔離級別名稱,以及逐級之間的區別?
- 在 Mysql 中 ENUM 的用法是什麼?
- 如何定義 REGEXP?
- CHAR 和 VARCHAR 的區別?
- 列的字符串類型可以是什麼?
- 如何獲取當前的 Mysql 版本?
- Mysql 中使用什麼存儲引擎?
- Mysql 驅動程序是什麼?
- TIMESTAMP 在 UPDATE CURRENT_TIMESTAMP 數據類型上做什麼?
- 主鍵和候選鍵有什麼區別?
- 如何使用 Unix shell 登錄 Mysql?
- myisamchk 是用來做什麼的?
- MYSQL 數據庫服務器性能分析的方法命令有哪些?
- 如何控制 HEAP 表的最大尺寸?
- MyISAM Static 和 MyISAM Dynamic 有什麼區別?
- federated 表是什麼?
- 如果一個表有一列定義為 TIMESTAMP,將發生什麼?
- 列設置為 AUTO INCREMENT 時,如果在表中達到最大值,會發生什麼情況?
- 怎樣才能找出最後一次插入時分配了哪個自動增量?
- 你怎麼看到為表格定義的所有索引?
- LIKE 聲明中的%和_是什麼意思?
- 如何在 Unix 和 Mysql 時間戳之間進行轉換?
- 列對比運算符是什麼?
- 我們如何得到受查詢影響的行數?
- Mysql 查詢是否區分大小寫?
- LIKE 和 REGEXP 操作有什麼區別?
- BLOB 和 TEXT 有什麼區別?
- mysql_fetch_array 和 mysql_fetch_object 的區別是什麼?
- 我們如何在 mysql 中運行批處理模式?
- MyISAM 表格將在哪裡存儲,並且還提供其存儲格式?
- Mysql 中有哪些不同的表格?
- ISAM 是什麼?
- InnoDB 是什麼?
- Mysql 如何優化 DISTINCT?
- 如何輸入字符為十六進制數字?
- 如何顯示前 50 行?
- 可以使用多少列創建索引?
- NOW()和 CURRENT_DATE()有什麼區別?
- 什麼樣的對象可以使用 CREATE 語句創建?
- Mysql 表中允許有多少個 TRIGGERS?
- 什麼是非標準字符串類型?
- 什麼是通用 SQL 函數?
- 解釋訪問控制列表
- MYSQL 支持事務嗎?
- mysql 裡記錄貨幣用什麼字段類型好
- MYSQL 數據表在什麼情況下容易損壞?
- mysql 有關權限的表都有哪幾個?
- Mysql 中有哪幾種鎖?
3、MySQL 性能調優與架構設計
- 基礎篇:
- MySQL基本介紹
- MySQL架構組成
- MySQL存儲引擎簡介
- MySQL安全管理
- MySQL備份與恢復
- 性能優化篇:
- 影響MySQLServer性能的相關因素
- MySQL數據庫鎖定機制
- MySQL數據庫Query的優化
- MySQL數據庫Schema設計的性能優化
- MySQLServer性能優化
- 常用存儲引擎優化
- 架構設計篇:
- MySQL可擴展設計的基本原則
- 可擴展性設計之MySQLReplication
- 可擴展性設計之數據切分
- 可擴展性設計之Cache與Search的..
- MySQLCluster
- 高可用設計之思路及方案
- 高可用設計之MySQL監控
MySQL架構與歷史
和其他數據庫系統相比,MySQL有點與眾不同,它的架構可以在多種不同場景中應用併發揮好的作用,但同時也會帶來-點選擇上的困難。MySQL並不完美,卻足夠靈活,能夠適應高要求的環境,例如Web類應用。同時,MySQL既可以嵌入到應用程序中,也可以支持數據倉庫、內容索引和部署軟件、高可用的冗餘系統、在線事務處理系統(OLTP)等各種應用類型。
轉發+關注後留意私信回覆【架構書籍】即可免費領取史上最全MySQL實戰文檔
服務器性能剖析
在我們的技術諮詢生涯中,最常碰到的三個性能相關的服務請求是:如何確認服務器是否達到了性能最佳的狀態、找出某條語句為什麼執行不夠快,以及診斷被用戶描述成“停頓"、“堆積"或者“卡死"的某些間歇性疑難故障。本章將主要針對這三個問題做出解答。我們將提供- - 些工具和技巧來優化整機的性能、優化單條語句的執行速度,以及診斷或者解決那些很難觀察到的問題(這些問題用戶往往很難知道其根源,有時候甚至都很難察覺到它的存在)。
查詢性能優化
前面是介紹瞭如何設計最優的庫表結構、如何建立最好的索引,這些對於高性能來說是必不可少的。但這些還不夠一還需 要合理的設計查詢。如果查詢寫得很糟糕,即使庫表結構再合理、索引再合適,也無法實現高性能。
MySQL高級特性
MySQL從5.0和5.1版本開始引入了很多高級特性,例如分區、觸發器等,這對有其他關係型數據庫使用背景的用戶來說可能並不陌生。這些新特性吸引了很多用戶開始使用MySQL。不過,這些特性的性能到底如何,還需要用戶真正使用過才能知道。這裡我們將為大家介紹,在真實的世界中,這些特性表現如何,而不是隻簡單地介紹參考手冊或者宜傳材料.上的數據。
轉發+關注後留意私信回覆【架構書籍】即可免費領取史上最全MySQL實戰文檔
優化服務器設置
這裡我們將解釋為MySQL服務器創建一個靠譜的配置文件的過程。這是一個很繞的過程,有很多有意思的關注點和值得關注的思路。關注這些點很有必要,因為創建個好配置的最快方法不是從學習配置項開始,也不是從問哪個配置項應該怎麼設置或者怎麼修改開始,更不是從檢查服務器行為和詢問哪個配置項可以提升性能開始。
最好是從理解MySQL內核和行為開始。然後可以利用這些知識來指導配置MySQL.最後,可以將想要的配置和當前配置進行比較,然後糾正重要並且有價值的不同之處。
轉發+關注後留意私信回覆【架構書籍】即可免費領取史上最全MySQL實戰文檔
複製
MySQL內建的複製功能是構建基於MySQL的大規模、高性能應用的基礎,這類應用使用所謂的“水平擴展”的架構。我們可以通過為服務器配置一個或多個備庫生1的方式來進行數據同步。複製功能不僅有利於構建高性能的應用,同時也是高可用性、可擴展性、災難恢復、備份以及數據倉庫等工作的基礎。事實上,可擴展性和高可用性通常是相關聯的話題,我們會在接下來的三章詳細闡述。
轉發+關注後留意私信回覆【架構書籍】即可免費領取史上最全MySQL實戰文檔
可擴展的MySQL
在此將展示如何構建-一個 基於MySQL的應用,並且當規模變得越來越龐大時,還能保證快速、高效並且經濟。有些應用僅僅適用於--臺或少數幾臺服務器,那麼哪些可擴展性建議是和這些應用相關的呢?大多數人從不會維護超大規模的系統,井且通常也無法效仿在主流大公司所使用的策略。本章會涵蓋這- - 系列的策略。我們已經建立或者協助建立了許多應用,包括從單臺或少量服務器的應用到使用上千臺服務器的應用。選擇一個合適的策略能夠大大地節約時間和金錢。MySQL經常被批評很難進行擴展,有些情況下這種看法是正確的,但如果選擇正確的架構並很好地實現,就能夠非常好地擴展MySQL.但是擴展性並不是-一個很好理解的主題,所以我們先來理清- -些容易混淆的地方。
轉發+關注後留意私信回覆【架構書籍】即可免費領取史上最全MySQL實戰文檔
雲端的MySQL
應用層優化
如果在提高MySQL的性能上花費太多時間,容易使視野侷限於MySQL本身,而忽略了用戶體驗。回過頭來看,也許可以意識到,或許MySQL已經足夠優化,對於用戶看到的響應時間而言,其所佔的比重已經非常之小,此時應該關注下其他部分了。這是個很不錯的觀點,尤其是對DBA而言,這是很值得去做的正確的事。但如果不是MySQL,那又是什麼導致了問題呢?使用第3章提到的技術,通過測量可以快速而準確地給出答案。如果能順著應用的邏輯過程從頭到尾來剖析,那麼找到問題的源頭一般來說並不困難。有時,儘管問題在MySQL.上,也很容易在系統的另一部分得到解決。
備份和恢復
如果沒有提前做好備份規劃,也許以後會發現已經錯失了- -些最佳的選擇。例如,在服務器已經配置好以後,才想起應該使用LVM,以便可以獲取文件系統的快照一但這時已經太遲了。在為備份配置系統參數時,可能沒有注意到某些系統配置對性能有著重要影響。如果沒有計劃做定期的恢復演練,當真的需要恢復時,就會發現並沒有那麼順利。
MySQL用戶工具
MySQL服務器發行包中並沒有包含針對許多常用任務的工具,例如監控服務器或比較不同服務器間數據的工具。幸運的是,Oracle 的商業版提供了- -些擴展工具,並且MySQL活躍的開源社區和第三方公司也提供了- -系列的工具,降低了自己“重複發明輪子”的需要。
總目錄
轉發+關注後留意私信回覆【架構書籍】即可免費領取史上最全MySQL實戰文檔
閱讀更多 java互聯網架構 的文章