11. 你用的Mysql是哪個引擎,各引擎之間有什么區別?
主要 MyISAM 與 InnoDB 兩個引擎,其主要區別如下:
InnoDB 支持事務,MyISAM 不支持,這一點是非常之重要。事務是一種高級的處理方式,如在一些列增刪改中只要哪個出錯還可以回滾還原,而 MyISAM就不可以了;
MyISAM 適合查詢以及插入為主的應用,InnoDB 適合頻繁修改以及涉及到安全性較高的應用;
InnoDB 支持外鍵,MyISAM 不支持;
MyISAM 是默認引擎,InnoDB 需要指定;
InnoDB 不支持 FULLTEXT 類型的索引;
InnoDB 中不保存表的行數,如 select count() from table 時,InnoDB;需要掃描一遍整個表來計算有多少行,但是 MyISAM 只要簡單的讀出保存好的行數即可。注意的是,當 count()語句包含 where 條件時 MyISAM 也需要掃描整個表;
對於自增長的字段,InnoDB 中必須包含只有該字段的索引,但是在 MyISAM表中可以和其他字段一起建立聯合索引;清空整個表時,InnoDB 是一行一行的刪除,效率非常慢。MyISAM 則會重建表;
InnoDB 支持行鎖(某些情況下還是鎖整表,如 update table set a=1 where user like '%lee%'
12. 數據庫的優化?
1.優化索引、SQL 語句、分析慢查詢;
2.設計表的時候嚴格根據數據庫的設計范式來設計數據庫;
3.使用緩存,把經常訪問到的數據而且不需要經常變化的數據放在緩存中,能節約磁盤IO
4.優化硬件;采用SSD,使用磁盤隊列技術(RAID0,RAID1,RDID5)等
5.采用MySQL 內部自帶的表分區技術,把數據分層不同的文件,能夠提高磁盤的讀取效率;
6.垂直分表;把一些不經常讀的數據放在一張表里,節約磁盤I/O;
7.主從分離讀寫;采用主從復制把數據庫的讀操作和寫入操作分離開來;
8.分庫分表分機器(數據量特別大),主要的的原理就是數據路由;
9.選擇合適的表引擎,參數上的優化
10.進行架構級別的緩存,靜態化和分布式;
11.不采用全文索引;
12.采用更快的存儲方式,例如 NoSQL存儲經常訪問的數據**。
13. Mysql數據庫如何分區、分表?
分表可以通過三種方式:Mysql集群、自定義規則和merge存儲引擎。
分區有四類:
RANGE 分區:基於屬於一個給定連續區間的列值,把多行分配給分區。
LIST 分區:類似於按RANGE分區,區別在於LIST分區是基於列值匹配一個離散值集合中的某個
值來進行選擇。
HASH分區:基於用戶定義的表達式的返回值來進行選擇的分區,該表達式使用將要插入到表中的
這些行的列值進行計算。這個函數可以包含MySQL 中有效的、產生非負整數值的任何表達式。
KEY 分區:類似於按HASH分區,區別在於KEY分區只支持計算一列或多列,且MySQL 服務器
提供其自身的哈希函數。必須有一列或多列包含整數值。
14. Sql注入是如何產生的,如何防止?
程序開發過程中不注意規范書寫sql語句和對特殊字符進行過濾,導致客戶端可以通過全局變量
POST和GET提交一些sql語句正常執行。產生Sql注入。下面是防止辦法:
a. 過濾掉一些常見的數據庫操作關鍵字,或者通過系統函數來進行過濾。
b. 在PHP配置文件中將Register_globals=off;設置為關閉狀態
c. SQL語句書寫的時候盡量不要省略小引號(tab鍵上面那個)和單引號
d. 提高數據庫命名技巧,對於一些重要的字段根據程序的特點命名,取不易被猜到的
e. 對於常用的方法加以封裝,避免直接暴漏SQL語句
f. 開啟PHP安全模式:Safe_mode=on;
g. 打開magic_quotes_gpc來防止SQL注入
h. 控制錯誤信息:關閉錯誤提示信息,將錯誤信息寫到系統日志。
i. 使用mysqli或pdo預處理。
15. NoSQL和關系數據庫的區別?
a. SQL數據存在特定結構的表中;而NoSQL則更加靈活和可擴展,存儲方式可以省是JSON文檔、哈希表或者其他方式。
b. 在SQL中,必須定義好表和字段結構后才能添加數據,例如定義表的主鍵(primary key),索引(index),觸發器(trigger),存儲過程(stored procedure)等。表結構可以在被定義之后更新,但是如果有比較大的結構變更的話就會變得比較復雜。在NoSQL中,數據可以在任何時候任何地方添加,不需要先定義表。
c. SQL中如果需要增加外部關聯數據的話,規范化做法是在原表中增加一個外鍵,關聯外部數據表。而在NoSQL中除了這種規范化的外部數據表做法以外,我們還能用如下的非規范化方式把外部數據直
接放到原數據集中,以提高查詢效率。缺點也比較明顯,更新審核人數據的時候將會比較麻煩。
d. SQL 中可以使用JOIN表鏈接方式將多個關系數據表中的數據用一條簡單的查詢語句查詢出來。NoSQL暫未提供類似JOIN的查詢方式對多個數據集中的數據做查詢。所以大部分NoSQL使用非規范化的數據存儲方式存儲數據。
e. SQL中不允許刪除已經被使用的外部數據,而NoSQL中則沒有這種強耦合的概念,可以隨時刪除任何數據。
f. SQL中如果多張表數據需要同批次被更新,即如果其中一張表更新失敗的話其他表也不能更新成功。這種場景可以通過事務來控制,可以在所有命令完成后再統一提交事務。而NoSQL中沒有事務這個概念,每一個數據集的操作都是原子級的。
g. 在相同水平的系統設計的前提下,因為NoSQL中省略了JOIN查詢的消耗,故理論上性能上是優於SQL的。
