01. 列舉常見的關系型數據庫和非關系型都有那些?
關系型:Oracle、DB2、Microsoft SQL Server、MySQL、SQLite
非關系型:Redis、Hbase、MongodDB
02. MySQL常見數據庫引擎及比較?
傳送門:MySQL常見數據庫引擎及比較
03. 簡述數據三大范式?
傳送門: MySQL數據三大范式
04. 什么是事務?MySQL如何支持事務?
傳送門:MySQL事務
05. 簡述數據庫設計中一對多和多對多的應用場景?
一對多:學生與班級---一個學生只能屬於一個班級,一個班級可以有多個學生
多對多:學生與課程---一個學生可以選擇多個課程,一個課程也可以被多個學生選擇
一對多把一寫在多中,多對多把兩者的關系另外建一張表聯系起來
06. 如何基於數據庫實現商城商品計數器?
創建一個商城表---包含(id,商品名,每一個商品對應數量)
create table product(
id primary key auto_increment, pname varchar(64), pcount int
);
07. 簡述觸發器、函數、視圖、存儲過程?
觸發器:觸發器是一個特殊的存儲過程,它是MySQL在insert、update、delete的時候自動執行的代碼塊。
create trigger trigger_name after/before insert /update/delete on 表名 for each row begin sql語句:(觸發的語句一句或多句) end
函數:MySQL中提供了許多內置函數,還可以自定義函數(實現程序員需要sql邏輯處理)
自定義函數創建語法:
創建:CREATE FUNCTION 函數名稱(參數列表) RETURNS 返回值類型 函數體 修改: ALTER FUNCTION 函數名稱 [characteristic ...] 刪除:DROP FUNCTION [IF EXISTS] 函數名稱 調用:SELECT 函數名稱(參數列表)
視圖:視圖是由查詢結果形成的一張虛擬表,是表通過某種運算得到的一個投影
create view view_name as select 語句
存儲過程:把一段代碼封裝起來,當要執行這一段代碼的時候,可以通過調用該存儲過程來實現(經過第一次編譯后再次調用不需要再次編譯,比一個個執行sql語句效率高)
create procedure 存儲過程名(參數,參數,…) begin //代碼 end
08. MySQL索引種類?
傳送門:MySQL索引類型
09. 索引在什么情況下遵循最左前綴的規則?
在使用組合索引查詢的時候需要遵循“最左前綴”規則
最左前綴匹配原則,非常重要的原則,mysql會一直向右匹配直到遇到范圍查詢(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d= 4 如果建立(a,b,c,d)順序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引則都可以用到,a,b,d的順序可以任意調整。=和in可以亂序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意順序,MySQL的查詢優化器會幫你優化成索引可以識別的形式。
10. 主鍵和外鍵的區別?
主鍵Primary key:數據庫實體完整性的一種規則,唯一標示一個實體,取值非空唯一。比如,學生表的學號。
外鍵 Foreign key:數據庫參照完整性的一種規則,將兩表或者多張表聯系起來,取值必須來自參照表的參照字段的值,可為空也可不為空。比如,選課表里的學號。
11. MySQL常見的函數?
聚合函數:
AVG(col)返回指定列的平均值
COUNT(col)返回指定列中非NULL值的個數
MIN(col)返回指定列的最小值
MAX(col)返回指定列的最大值
SUM(col)返回指定列的所有值之和
GROUP_CONCAT(col) 返回由屬於一組的列值連接組合而成的結果
數學函數:
ABS(x) 返回x的絕對值
BIN(x) 返回x的二進制(OCT返回八進制,HEX返回十六進制)
12. 列舉 創建索引但是無法命中索引的8種情況。
1.如果條件中有or,即使其中有條件帶索引也不會使用(這也是為什么盡量少用or的原因)
2.對於多列索引,不是使用的第一部分,則不會使用索引
3.like查詢是以%開頭
4.如果列類型是字符串,那一定要在條件中將數據使用引號引用起來,否則不使用索引
5.如果mysql估計使用全表掃描要比使用索引快,則不使用索引
6 對小表查詢
7 提示不使用索引
8 統計數據不真實
9.單獨引用復合索引里非第一位置的索引列.
13. 如何開啟慢查詢日志?
傳送門:MySQL開啟慢查詢日志
1 執行 SHOW VARIABLES LIKE “%slow%”,獲知 mysql 是否開啟慢查詢 slow_query_log 慢查詢開啟狀態 OFF 未開啟 ON 為開啟 slow_query_log_file 慢查詢日志存放的位置(這個目錄需要MySQL的運行帳號的可寫權限,一般設置為MySQL的數據存放目錄)
2 修改配置文件( 放在[mysqld]下),重啟 long_query_time 查詢超過多少秒才記錄
3 測試是否成功
4 慢查詢日志文件的信息格式
作用:開啟慢查詢日志,可以讓MySQL記錄下查詢超過指定時間的語句,通過定位分析性能的瓶頸,才能更好的優化數據庫系統的性能。
14. 數據庫導入導出命令(結構+數據)?
傳送門:MySQL數據庫導入導出命令
15. 數據庫優化方案?
傳送門:MySQL優化
1、選取最適用的字段屬性
2、使用連接(JOIN)來代替子查詢(Sub-Queries)
3、使用聯合(UNION)來代替手動創建的臨時表
4、事務(當多個用戶同時使用相同的數據源時,它可以利用鎖定數據庫的方法來為用戶提供一種安全的訪問方式,這樣可以保證用戶的操作不被其它的用戶所干擾)
5.鎖定表(有些情況下我們可以通過鎖定表的方法來獲得更好的性能)
6、使用外鍵(鎖定表的方法可以維護數據的完整性,但是它卻不能保證數據的關聯性。這個時候我們就可以使用外鍵)
7、使用索引
8、優化的查詢語句(絕大多數情況下,使用索引可以提高查詢的速度,但如果SQL語句使用不恰當的話,索引將無法發揮它應有的作用)
16. char和varchar的區別?
1、對於MyISAM表,盡量使用Char,對於那些經常需要修改而容易形成碎片的myisam和isam數據表就更是如此,它的缺點就是占用磁盤空間;
2、對於InnoDB表,因為它的數據行內部存儲格式對固定長度的數據行和可變長度的數據行不加區分(所有數據行共用一個表頭部分,這個標頭部分存放着指向各有關數據列的指針), 所以使用char類型不見得會比使用varchar類型好。事實上,因為char類型通常要比varchar類型占用更多的空間,所以從減少空間占用量和減少磁盤i/o的角度,使用varchar類型反而更有利;
3、存儲很短的信息,比如門牌號碼101,201……這樣很短的信息應該用char,因為varchar還要占個byte用於存儲信息長度,本來打算節約存儲的現在得不償失。
4、固定長度的。比如使用uuid作為主鍵,那用char應該更合適。因為他固定長度,varchar動態根據長度的特性就消失了,而且還要占個長度信息。
5、十分頻繁改變的column。因為varchar每次存儲都要有額外的計算,得到長度等工作,如果一個非常頻繁改變的,那就要有很多的精力用於計算,而這些對於char來說是不需要的。
char固定長度,存取速度快,犧牲存儲空間來提高效率
varchar長度依照的字符長度而定,存取速度較varchar慢,犧牲存取效率,提高存儲空間利用率
注意:取數據的時候,char類型的要用trim()去掉多余的空格,而varchar是不需要的;CHAR(10)若輸入數據的字符數小於10,則系統自動在其后添加空格來填滿設定好的空間。若輸入的數據過長,將會截掉其超出部分。VARCHAR(10)數據類型的存儲長度為實際數值長度。
char的存儲方式是:對英文字符(ASCII)占用1個字節,對一個漢字占用兩個字節;
varchar的存儲方式是:對每個英文字符占用2個字節,漢字也占用2個字節。
17. 簡述MySQL的執行計划?
傳送門:MySQL的執行計划
18. 在對name做了唯一索引前提下,簡述以下區別:
select * from tb where name = ‘Oldboy’
select * from tb where name = ‘Oldboy’ limit 1