資料庫常見索引類型:
資料庫并發問題:
3.事務的四個特性
4.資料庫事務隔離級别:
5.資料庫鎖鎖的種類:
6.悲觀鎖和樂觀鎖
悲觀鎖:在關系資料庫管理系統裡,悲觀并發控制(又名“悲觀鎖”,Pessimistic Concurrency Control,縮寫“PCC”)是一種并發控制的方法。它可以阻止一個事務以影響其他使用者的方式來修改資料。如果一個事務執行的操作都某行資料應用了鎖,那隻有當這個事務把鎖釋放,其他事務才能夠執行與該鎖沖突的操作。悲觀鎖的實作,往往依靠資料庫層提供的鎖機制。Mysql InnoDB如果想使用悲觀鎖,需要關閉自動送出屬性(autocommit),這個是Mysql預設的,Mysql裡可以通過select…for update的方式開啟悲觀鎖,不過Mysql預設是行鎖,而行級鎖都是基于索引的,如果sql用不到索引則不會使用行級鎖,會把整個表鎖住。悲觀鎖實際上是先取鎖再通路,效率低,降低了并行性,而且會會阻塞其他讀事務,造成了不必要鎖,增加了系統負載。
樂觀鎖:在關系資料庫管理系統裡,樂觀并發控制(又名“樂觀鎖”,Optimistic Concurrency Control,縮寫“OCC”)是一種并發控制的方法。它假設多使用者并發的事務在處理時不會彼此互相影響,各事務能夠在不産生鎖的情況下處理各自影響的那部分資料。樂觀鎖并不需要使用資料庫提供的鎖機制,一般隻需要比對資料版本即可。樂觀鎖在多個條件巧合下回出現丢失更新的問題。
7、Mysql常用資料庫引擎InnoDB,支援事務、行級鎖、并發性能更好。MYISAM不支援事務,隻有表級鎖。
8.項目裡DB層面很多未送出的事務,原因是基本上都是因為出現的并發的DML同一行資料導緻的,比如說兩個并發的update同一行資料,後面的update語句而開啟的事務就會等待第一個update執行完畢送出事務才能執行。
9、對于資料庫字元集的選擇上,能用utf8mb4字元集就用64吧,不然還得過濾偏僻字和emoj表情
10、項目裡使用内網域名連結資料庫,不要直接使用ip
11、定義字段時禁止使用枚舉,使用tinyint代替,因為增加枚舉類型和減少都得DDL操作,而且資料枚舉實際存儲的也是整數
12、禁止在識别度不高的字段上建立索引,因為基本與全表掃描差不多,比如sex字段基本隻有0/1,而shop_id的識别度就會很高,建立聯合索引的時候,區分度高的放在前面
13、禁止使用屬性隐式轉換,比如phone字段是varchar類型,但是在用select * from t where phone = 123123會出現無法命中索引的問題。也禁止在where後的字段上作函數或者表達式。
14、update語句禁止不帶條件,萬一寫錯有很大風險
15、千萬記住後端開發的一點就是,能在伺服器上做的運算、排序盡量在項目裡做,資料庫隻做資料的查詢、篩選,将資料庫的壓力轉化到機器。
16、mysql語句執行順序:開始->FROM子句->WHERE子句->GROUP BY子句->HAVING子句->SELECT子句->ORDER BY子句->LIMIT子句->最終結果
17、任何字段如果為非負數,必須是 unsigned
18、小數類型為 decimal,禁止使用 float 和 double。float 和 double 在存儲的時候,存在精度損失的問題,很可能在值的比較時,得到不正确的結果。
19、合理預估數值的大小,枚舉、人類年齡用tinyint等,像shopId、skuId等數值如果預估後面可能會超過int,那麼請定義成bigint.
20、mysql中InnoDB表為什麼要以自增id作為主鍵?