Linux運維工程在一般面試的時候都會問那些專業性的問題?今天給大家分享面試mysql中常問的一些問題,分享給大家。
1.MySQL 表的存儲引擎有哪些?它們之間有什麼差別?
MyISAM:預設的存儲引擎,不支援事務,但對于讀密集型的應用性能較好。
InnoDB:支援事務、行級鎖定、外鍵限制等特性,适合于寫密集型應用。
Memory:将表存儲在 RAM 中,适合于小數量的資料、臨時表或緩存等場景。
Archive:适合于僅插入和查詢資料,但不對資料進行更新和删除的場景。
NDB Cluster:支援分布式資料庫、高可用性等特性,适合于高并發、高可用的應用。
2.MySQL 的 ACID 是什麼意思?
ACID 是指資料庫事務必須滿足原子性、一緻性、隔離性和持久性四個特性。具體解釋如下:
原子性(Atomicity):事務中的所有操作,要麼全部完成,要麼全部失敗復原。
一緻性(Consistency):事務執行前後,資料保持一緻。
隔離性(Isolation):多個并發的事務彼此隔離,不能互相幹擾。
持久性(Durability):事務完成後,對資料庫的修改被永久儲存到磁盤上,不會因為系統故障而丢失。
3.MySQL 中索引的作用是什麼?有哪些類型的索引?
索引是一種資料結構,可以加速資料的查找和排序。MySQL 支援以下幾種類型的索引:
主鍵索引:用于唯一辨別表中的每一行記錄。
唯一索引:確定每一個索引鍵值隻對應一行記錄。
普通索引:基本的索引類型,沒有特殊的限制和限制。
全文索引:針對文本類型的字段進行全文搜尋。
4.介紹一下 MySQL 中的事務隔離級别及各自的特點?
MySQL 中的事務隔離級别有四種,分别為 READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ 和 SERIALIZABLE。它們之間的差別如下所示:
READ-UNCOMMITTED:最低的隔離級别,在此級别下,事務可以讀取未送出的資料,可能會産生髒讀、不可重複度和幻讀的問題。
READ-COMMITTED:已送出讀,針對同一行資料多次讀取可能會産生不可重複度和幻讀的問題。
REPEATABLE-READ:可重複讀,保證同一事務中對同一行資料的多次讀取結果一緻,但不能避免幻讀的問題。
SERIALIZABLE:最高的隔離級别,完全解決了髒讀、不可重複度和幻讀的問題,但性能較差。
5.MySQL 中 InnoDB 存儲引擎是如何實作 MVCC 的?
InnoDB 的 MVCC(Multiversion Concurrency Control)是通過在每一行記錄後面儲存兩個隐藏的列來實作的,分别為建立版本号和删除版本号。InnoDB 使用建立版本号判斷哪些版本是有效的,使用删除版本号判斷哪些版本已經被删除。通過這種方式,可以在不加鎖的情況下實作并發通路,提高資料庫的并發處理性能。
6.MySQL 中的視圖是什麼?有什麼作用?
視圖是一種虛表,它基于 SQL 查詢語句建立,并且可以像普通表一樣被查詢和操作。視圖 可以簡化複雜的查詢操作,隐藏複雜的資料結構,提供更好的資料抽象。此外,視圖還可以用于保護資料的安全性,控制資料的通路範圍。
7.MySQL 有哪些常見的優化方法?
使用索引:確定常用查詢使用合适的索引。
避免使用‘SELECT *’:隻查詢需要的字段,減少不必要的IO開銷。
盡量避免使用子查詢:子查詢另外一段SQL語句執行,效率較低,可以用 JOIN 代替。
分解大的 SQL 語句:将大的 SQL 語句拆分成多個小的語句,可以減少鎖定的時間。
控制事務的開銷:盡量使用短的事務并減少事務的開銷。
避免全表掃描和排序:全表掃描和排序需要大量的 IO 開銷,應該盡量避免使用。
應用程式級緩存:利用應用程式級緩存可以減少資料庫的通路次數,提高查詢性能。
8.MySQL 中如何檢查表是否存在?如果不存在如何建立新表?
可以使用指令 SHOW TABLES LIKE 'table_name' 檢查表是否存在。如果查詢傳回結果為空,說明表不存在。可以使用 CREATE TABLE 語句來建立新表。
9.MySQL 中 BLOB 和 TEXT 類型的差別是什麼?
BLOB 和 TEXT 類型都用于存儲大文本資料,它們的差別在于存儲方式不同。BLOB 類型将二進制資料以類似于檔案的形式存儲在二進制形式中,而 TEXT 類型則将文本以字元集編碼的形式存儲。是以,BLOB 類型适用于存儲圖檔、音頻和視訊等二進制資料,而 TEXT 類型适用于存儲較短的文本資料。
10.對于大量資料的插入,我們應該如何提高插入性能?
可以采用如下的優化措施:
批量插入:使用 INSERT INTO ... VALUES (),(),() ... 的方式一次性插入多條資料,可以減少網絡 IO 開銷,提高插入性能。
關閉索引:在大量資料插入完成後,再開啟索引,可以避免索引維護的開銷對插入性能的影響。
使用 LOAD DATA INFILE:使用該指令可以一次性導入一個檔案中的資料,速度很快。
優化 SQL 語句:可以通過删除不必要的語句和字段,減小插入資料的大小,提高插入性能。
11.MySQL 中的主從同步是什麼?有什麼用途?
主從同步是 MySQL 中一種常用的資料複制技術,它将一個 MySQL 伺服器(稱為主伺服器)上的資料複制到另一個 MySQL 伺服器(稱為從伺服器)。主從同步技術可以用于資料備份、讀寫分離、負載均衡等場景。
12.MySQL 中如何使用 JOIN 實作表的關聯查詢?
JOIN 是一種 SQL 連接配接操作,可以将兩個或多個表中符合特定條件的行組合到一起。MySQL 支援 INNER JOIN(内連接配接)、LEFT JOIN(左連接配接)、RIGHT JOIN(右連接配接)及 FULL OUTER JOIN(全連接配接)等不同類型的 JOIN 操作。使用JOIN實作表的關聯查詢需要指定要連接配接的表及條件。例如:
SELECT *
FROM table1
INNER JOIN table2
ON table1.id = table2.id;
該查詢将從 table1 和 table2 表中查找 id 列相等的所有行,并将它們按照相應的列連接配接起來。
13.如何優化 SELECT 語句的性能?
可以采用以下措施來優化 SELECT 語句的性能:
使用适當的索引。
減少查詢傳回的行數,使用 LIMIT 限制傳回的行數。
避免使用 SELECT * 查詢所有列的資料,隻查詢需要的列資料。
避免使用 DISTINCT 關鍵字,如果可以使用 GROUP BY 代替。
避免使用子查詢。
14.MySQL 中 LOCK TABLES 的作用是什麼?
LOCK TABLES 用于鎖定一個或多個資料庫表,以防止其他會話對其進行更改。該指令主要用于備份資料庫、表維護等場景。在使用 LOCK TABLES 指令時,需要注意以下兩點:
在鎖定表時,其他線程無法與該表進行互動,包括查詢和更新等操作。
在解除鎖定後,将自動釋放所有為該線程配置設定的記憶體和臨時表。
15.如何在 MySQL 中使用子查詢?
子查詢是指在一個 SQL 語句中嵌套另一個 SQL 語句,常用于對資料進行篩選和分類。在 MySQL 中可以使用以下文法來建立子查詢:
SELECT column1, column2
FROM table1
WHERE column3 IN (SELECT column4 FROM table2);
該查詢将擷取 table1 表中 column3 列值等于 table2 表的
16.Mysql中如何建立觸發器?
可以使用CREATE TRIGGER語句來建立觸發器。
建立一個觸發器,在插入資料時同時向另一張表中插入相應資訊可以使用如下語句:
CREATE TRIGGER trigger_name AFTER INSERT ON table_name FOR EACH ROW INSERT INTO
another_table (column1, column2) VALUES (NEW.column1, NEW.column2);
17.Mysql中如何設定連接配接逾時和執行逾時時間?
可以在連接配接字元串中設定連接配接逾時時間,可以使用SET語句設定執行逾時時間
mysql --connect_timeout=10 -u root -p my_database; SET max_execution_time = 300;
整理不易,歡迎轉發點贊收藏,關注我每天分享運維知識