三大范式?
第一范式(1NF)
數據庫表中的每一個字段都是不可拆分的
第二范式(2NF)
要求實體的屬性完全依賴於主關鍵字。所謂完全依賴是指不能存在僅依賴主關鍵字一部分的屬性。
第三范式(3NF)
數據庫表中每一列都和主鍵直接相關,列於列之間不存在互相依賴關系
一張自增表里面總共有 17 條數據,刪除了最后 2 條數據,重啟 mysql 數據庫,又插入了一條數據,此時 id 是幾?
-
表類型如果是 MyISAM ,那 id 就是 18。
-
表類型如果是 InnoDB,那 id 就是 15。
InnoDB 表只會把自增主鍵的最大 id 記錄在內存中,所以重啟之后會導致最大 id 丟失。
說一下 ACID 是什么?
原子性:事務的各元素是不可分割的
一致性:事務中數據處於一致狀態,一組操作要么都成功,要么都失敗
隔離性:並發事務是彼此隔離的,隔離性可以防止多個事務並發執行時由於交叉執行而導致數據的不一致。事務隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重復讀(repeatable read)和串行化(Serializable)。
持久性:無論系統是否發生了故障,事務處理的結果是永久的
mysql 的內連接、左連接、右連接有什么區別?
內連接關鍵字:inner join;左連接:left join;右連接:right join。
內連接是把匹配的關聯數據顯示出來;
左連接是左邊的表全部顯示出來,右邊的表顯示出符合條件的數據
右連接與左連接相反
mysql 索引是怎么實現的?
索引是滿足某種特定查找算法的數據結構,而這些數據結構會以某種方式指向數據,從而實現高效查找數據。
具體來說 MySQL 中的索引,不同的數據引擎實現有所不同,但目前主流的數據庫引擎的索引都是 B+ 樹實現的,B+ 樹的搜索效率,可以到達二分法的性能,找到數據區域之后就找到了完整的數據結構了,所有索引的性能也是更好的。
說一下數據庫的事務隔離?
MySQL 的事務隔離是在 MySQL. ini 配置文件里添加的,在文件的最后添加:transaction-isolation = REPEATABLE-READ
可用的配置值:READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ、SERIALIZABLE。
-
READ-UNCOMMITTED:未提交讀,最低隔離級別、事務未提交前,就可被其他事務讀取(會出現幻讀、臟讀、不可重復讀)。
-
READ-COMMITTED:提交讀,一個事務提交后才能被其他事務讀取到(會造成幻讀、不可重復讀)。
-
REPEATABLE-READ:可重復讀,默認級別,保證多次讀取同一個數據時,其值都和事務開始時候的內容是一致,禁止讀取到別的事務未提交的數據(會造成幻讀)。
-
SERIALIZABLE:序列化,代價最高最可靠的隔離級別,該隔離級別能防止臟讀、不可重復讀、幻讀。
臟讀 :表示一個事務能夠讀取另一個事務中還未提交的數據。比如,某個事務嘗試插入記錄 A,此時該事務還未提交,然后另一個事務嘗試讀取到了記錄 A。
不可重復讀 :是指在一個事務內,多次讀同一數據。
幻讀 :指同一個事務內多次查詢返回的結果集不一樣。比如同一個事務 A 第一次查詢時候有 n 條記錄,但是第二次同等條件下查詢卻有 n+1 條記錄,這就好像產生了幻覺。發生幻讀的原因也是另外一個事務新增或者刪除或者修改了第一個事務結果集里面的數據,同一個記錄的數據內容被修改了,所有數據行的記錄就變多或者變少了。
說一下 mysql 常用的引擎?
InnoDB引擎提供了對數據庫 acid 事務的支持,並且還提供了行級鎖和外鍵的約束,它的設計的目標就是處理大數據容量的數據庫系統。
MyIASM 引擎不提供事務的支持,也不支持行級鎖和外鍵。因此當執行插入和更新語句時,即執行寫操作的時候需要鎖定這個表,所以會導致效率會降低。
如果只是對單表的讀操作遠多於寫操作,不需要事務支持,可以用MyISAM
說一下 mysql 的行鎖和表鎖?
MyISAM 只支持表鎖,InnoDB 支持表鎖和行鎖,默認為行鎖。
-
表級鎖:開銷小,加鎖快,不會出現死鎖。鎖定粒度大,發生鎖沖突的概率最高,並發量最低。
-
行級鎖:開銷大,加鎖慢,會出現死鎖。鎖力度小,發生鎖沖突的概率小,並發度最高。
說一下樂觀鎖和悲觀鎖?
-
樂觀鎖:每次去拿數據的時候都認為別人不會修改,所以不會上鎖,但是在提交更新的時候會判斷一下在此期間別人有沒有去更新這個數據。
-
悲觀鎖:每次去拿數據的時候都認為別人會修改,所以每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會阻止,直到這個鎖被釋放。
數據庫的樂觀鎖需要自己實現,在表里面添加一個 version 字段,每次修改成功值加 1,這樣每次修改的時候先對比一下,自己擁有的 version 和數據庫現在的 version 是否一致,如果不一致就不修改,這樣就實現了樂觀鎖。
mysql 問題排查都有哪些手段?
-
使用 show processlist 命令查看當前所有連接信息。
-
使用 explain 命令查詢 SQL 語句執行計划。
-
開啟慢查詢日志,查看慢查詢的 SQL。
如何做 mysql 的性能優化?
-
為搜索字段創建索引。
-
避免使用 select *,列出需要查詢的字段。
-
垂直分割分表。
-
選擇正確的存儲引擎。