PHP面試之三:MySQL數據庫

基礎考點

  • MySQL 數據類型mysql

整型:tinyint、smallint、mediumint、int、bigint
小數型:float、double、decimal
字符串型:varchar、char、text、blob
時間日期型:time、date、datetime、timestamp
枚舉類型:enum

在定義整型數據類型時,常常看到 int(4) 括號裏指定的是顯示長度,不限制值合法範圍,這個顯示長度要配合zerofill這個屬性纔有意義。sql


一、 VARCHARCHAR 更節約空間
二、 CHARVARCHAR 存儲效率更好
三、 VARCHARCHAR 的長度,若是存儲內容超出指定長度,會被截斷
四、 存儲常常改變的數據,CHAR 不容易產生碎片數據庫


儘可能避免使用 BLOB/TEXT 類型,致使嚴重的性能開銷安全


一、 有時可使用枚舉類型代替字符串類型
二、 枚舉類型內部存儲成整型(節省空間)
三、 避免使用數字做爲 enum枚舉 的常量,易混亂服務器


一、 儘可能使用 TIMESTAMP 來保存時間日期數據
二、 若是須要存儲微秒, 可使用 BIGINT 類型併發

  • MySQL 基礎操做負載均衡

鏈接與關閉:mysql -u -p -h -P函數

  • MySQL 存儲引擎(數據表)性能

MyISAM與InnoDB的區別日誌

一、 InnoDB支持事務,MyISAM不支持事務
二、 InnoDB支持行級鎖,MyISAM支持表鎖
三、 InnoDB數據存儲在共享表空間,MyISAM數據存儲在MyD文件和MyI文件
四、 InnoDB支持奔潰後的安全恢復,MyISAM不支持
五、 InnoDB對主鍵查詢的性能高於其餘存儲引擎
六、 MyISAM擁有全文索引、壓縮、空間函數
  • MySQL 鎖機制

因爲併發操做的產生,因此須要使用鎖進行併發控制
鎖分爲2種:共享鎖排他鎖,就是讀鎖寫鎖

共享鎖(讀鎖),不堵塞,多個用戶能夠同時讀同一資源,互不干擾

排他鎖(寫鎖),一個寫鎖會阻塞其餘讀鎖和寫鎖,這樣只容許一我的進行寫入操做,防止其餘人進行讀取或者寫入

注意:InnoDB支持行級鎖,MyISAM支持表鎖

  • MySQL 事務處理

注意:使用事務的前提是 表必須是InnoDB引擎

安全性考點

  • SQL注入

使用 預處理 來防止SQL注入

  • 特殊字符轉義

寫入數據庫的數據必須通過特殊字符轉義操做,此操做在應用層進行

  • 錯誤記錄

當發生查詢錯誤時,不能把錯誤信息返回給用戶,把錯誤記錄到日誌

索引考察點

  • 使用索引的優缺點

優勢:
一、減小服務器掃描的數據量
二、避免排序和臨時表
三、隨機I/O變順序I/O
四、提升查詢速度

缺點:
一、下降寫的速度
二、佔用磁盤
  • 索引使用場景

很是小的表(1~1000) 不使用索引
中型(1000~100W)   使用索引
大型(100W~1000W)  使用索引
超大(1000W以上)   索引 + 分區技術
  • 索引類型

一、普通索引
二、惟一索引 (在普通索引的基礎上,加上惟一約束)
三、主鍵索引 (在惟一索引的基礎上,加上不能爲Null)
四、組合索引
五、全文索引 (少用,只適合英文)
六、外鍵索引 (少用,使用業務邏輯進行數據關聯)
  • 索引建立原則

一、最適合索引的列是出如今where子句中的列,或鏈接子句中的列,而不是出如今SELECT關鍵字後的列
二、索引列基數越大,效果越好
三、對字符串進行索引,應該制定一個前綴長度,能夠節省大量索引空間
四、根據狀況建立複合索引,複合索引能提升查詢效率
五、避免建立過多的索引
六、主鍵儘可能選擇較短的數據類型
  • 索引注意事項

一、複合索引遵循前綴原則(重要,按順序)
二、like查詢,%不能在前面(在前面索引會失效,若是要在前面請使用第三方全文索引)
三、列is Null也是可使用索引
四、若是OR條件想用到索引,必須or先後的字段都須要是索引字段
五、列是字符串類型時,查詢時必定要使用引號(單或雙),索引纔會生效

SQL語句關聯考察點

  • 關聯操做

一、關聯更新
二、關聯查詢
  • 鏈接方式

一、交叉鏈接 Cross join (無條件)
    
    select * from A CROSS JOIN B CROSS JOIN C;

二、內鏈接 INNER JOIN (有條件的交叉鏈接) 簡寫 JOIN

    select * from A INNER JOIN B INNER JOIN C ON A.id = B.id;
    select * from A,B where A.id = B.id;
    select * from A T1 INNER JOIN A T2 ON T1.id = T2.id;
    
三、外鏈接
    
    左外鏈接 LEFT JOIN
    右外鏈接 RIGHT JOIN
    
四、聯合鏈接 (UNION重複的合併,UNION ALL重複的不合並)

    SELECT * FROM position UNION SELECT * FROM team; 
    SELECT * FROM position UNION ALL SELECT * FROM team; 
    **UNION ALL性能高於UNION**
    
五、全鏈接(MySQL不支持)

MySQL高擴展與高可用

  • 分庫

  • 分表(水平與垂直)

  • 讀寫分離

  • 主從複製

  • 負載均衡

相關文章
相關標籤/搜索