天天看點

資料庫

1nf 屬性值不可再分

2nf 消除非主屬性的 部分函數依賴 - > 每個非主屬性都完全依賴于候選鍵 避免出現備援行

3nf 消除非主屬性的 傳遞函數依賴

bcnf 消除主屬性的傳遞函數依賴

内連接配接 inner join 隻傳回兩張表比對的記錄

全連接配接 外連接配接 (outter) join 傳回兩張表比對的記錄 與 各自的多餘記錄

左連接配接 left join 傳回A表的多餘記錄 與比對的記錄

右連接配接 right join 傳回比對的記錄 和 B表多餘的記錄

事務是構成單一邏輯單元的操作集合

A atom 原子性 db的所有操作是一個不可分割的工作單元,保證了事務對資料庫的操作不會丢失

C cosistent 一緻性 資料不會因為事務的執行而遭到破壞 保證了事務對資料庫操作的正确執行

I isolate 隔離性 事務并發執行和單獨執行的結果是一樣的 ,并發的事務不必關心其他事務

D durable 持久性 事務對db的更新永久的反映在db中 保證了db的可恢複性

丢失更新 一個事務的更新被另外一個事務的更新替換 A事務先送出修改 B事務後送出修改 覆寫了A事務的修改

讀髒資料 一個事務可以讀取到另外事務未送出的資料 A事務讀取 B事務修改的資料,但B未送出,若B撤銷 則A讀的就是髒資料

不可重複讀 一個事務内多次讀同一個資料 資料前後不一緻 A事務多次讀同一個資料 同時B事務修改了該資料 A事務發現多次讀的同一個資料值不同

幻讀: 一個事務多次讀取資料的條數,資料的條數前後不一緻。 事務讀到了 其他事務新插入的資料 (1、MVCC加目前讀(for update/insert/select) 2通過MVCC+next-key lock解決)

一級封鎖協定: 寫時加x鎖 寫完釋放 避免丢失更新

二級: 在1級的基礎上加上 讀時加s鎖 讀完釋放s鎖 避免讀髒資料 因為1級加X鎖 讀的時候加s鎖加不上

三級: 在1級的基礎上加上 讀時加s鎖 事務結束後釋放 避免不可重複讀 讀的時候 其他事務不能加x鎖了

讀未送出 Read uncommited 避免丢失更新

讀送出 read commited 避免讀髒資料

可重複讀取 repeatable read 避免不可重複讀 (MYSQL 預設)

讀時不加鎖,寫加鎖

事務開始前建立ReadView判斷可見性,并從版本連結清單中找到第一個對目前事務可見的版本讀這個版本

寫加鎖

可序列化 serializble 事務一個個序列化執行 不能并發執行

mysql預設級别是可重複讀 不能解決幻讀問題 解決幻讀要加行間鎖

共享鎖 share locks s鎖 讀鎖 多個事務可以對對象T 加s鎖 但隻能同時讀 不能寫 此時也不能加 排他鎖

排他鎖 exclusive locks x鎖 寫鎖: 事務A對對象T加x鎖後 其他的事務 不能再對此對象加任何鎖 直到A釋放x鎖

活鎖: 某個事務永遠等待 解決方法:先來先服務,提升優先級

餓死: 事務序列中的每個事務都要對某資料加s鎖 且在短時間内釋放 那若又一個事務要對其加x鎖 則永遠輪不上 解決方法:加s鎖前 檢查是否有先于自己申請的加x鎖的事務

死鎖:多個事務競争同一資源 造成互相等待 若無外力推進 則一直等待

資料庫定義語言 建立資料庫中的對象 表 視圖 索引 聚簇create table view index cluster

數控操縱語言 insert update delete

資料庫控制語言 grant 授權 rollback 復原到上次送出 commit送出 revoke

資料庫查詢語言: select from where

索引是一種特殊的資料庫結構,由表中的一列或者多列組合而成,可以用來快速查詢資料表中是否由特定值的記錄。通過索引,查資料的時候不用讀完所有的記錄,隻使查詢索引列,否則資料庫将讀取所有的資訊進行比對。

索引應該在哪些字段上建立 更新不頻繁 具有區分性(判斷 )

優點:

大大加快資料的查詢速度

避免排序和臨時表

可以減少分組和排序的時間

缺點:

建立和維護索引較為耗時,在資料進行 增删改的時候 也需要動态維護索引 較為耗時

索引 占據磁盤空間

or 查詢字段 部分未使用索引

使用了左模糊 %

查詢時 資料類型錯誤 例如索引的類型是字元串 而查詢時寫成int類型

不符合 左字首 a ab abc 生效例如index(a,b,c) 不查a 隻查bc 或分别查b c 都不能利用索引

is null 無法使用索引 mysql建議索引不為空

索引的列不獨立 就是指被索引的列 不能是表達式的一部分 不能是函數的參數

範圍查詢會失效

如何檢視是否生效 sql語句加上explain可以進行查詢分析

表的讀取順序資料

讀取操作的操作類型

哪些索引可以使用

哪些索引被實際使用

表之間的引用

每張表有多少行被優化器查詢

哈希函數的構造方法:

直接定址法 位址大小要等于關鍵字集合

僞随機數法 (用于關鍵字長度不同)

平方取中法(取中間幾位)

除留餘數法 除的這個數 最好是個質數

解決沖突的方法:

開放定址: 線性探測再散列 平方探測再散列

鍊位址法(拉鍊法)

再散列法

主鍵一定是聚簇索引 聚簇索引會存整行資料

聯合索引 隻存索引字段和主鍵 當查詢非索引字段時 要回表 查詢聚簇索引找到要查詢的字段

InnoDB

非葉子節點隻存儲key,葉子節點隻存儲記錄(葉子節點内部資料是順序存儲的),葉子節點之間用連結清單連起來

由于葉子節點之間使用連結清單相連,便于整表查詢,範圍查詢

查詢效率穩定:每次隻有查到葉子節點才能查到資料

查詢效率高:由于非葉子節點隻存key,所占的空間較小,是以一個非葉子節點上可以存多個key,查找的時候再使用,最後形成一個又矮又胖的樹,在非葉子節點上可以根據二分法找到資料的位置,樹又比較矮是以效率高

mysql -uroot -p12345 # 輸入密碼進入mysql

show databases 顯示資料庫

create database databasename 建立資料庫

use databasename 選擇資料庫

sql注入就是在使用者輸入字元串中加入SQL語句,如果設計不良的程式中忽略了檢查,這些注入的SQL語句就會被資料庫伺服器認為是正常的SQL 語句運作,攻擊者就會執行計劃外的指令 或 通路未被授權的資料

如何避免

過濾輸入内容,校驗字元串

參數化查詢 不會将參數作為sql語句的一部分處理 而是在編譯完成後 套用參數運作

安全測試 安全審計

避免使用動态SQL

限制資料庫權限

避免向使用者顯示資料庫錯誤

擷取目前日期 select GETDATE()

Redis是非關系型鍵值資料庫,可存儲鍵和五種類型之間的映射

鍵的類型隻能為字元串

值的類型有五種:

STRING 字元串 整數 浮點數

計數器

LIST 清單 兩端壓入或彈出

可以用于消息隊列 lpush rpop寫入讀取消息 最好使用Kafka RabbitMQ等消息中間件

SET 無序集合

實作交集 并集 進而實作共同好友

HASH 鍵值隊的無序散清單

ZSET 有序集合(跳躍表)

可實作有序性操作 實作排行榜

應用:

緩存:熱點資料放入記憶體 設定最大使用量 淘汰政策保證緩存命中率

查找表

會話緩存: 使用Redis存儲多台應用伺服器的會話資訊,當伺服器不存儲使用者會話資訊時,伺服器不再具有狀态,使用者可以請求任意一個伺服器,實作高可用和可伸縮

資料庫

noeviction 不淘汰,滿了抛出異常

allkeys-random 對所有資料 随機選擇淘汰

allkeys-lru 對所有資料 将最近最少使用的資料淘汰

volatile-random 對已設定過期時間的資料 随機選擇淘汰

volatile-lru 對已設定過期時間的資料 lru淘汰 least rencently used

volatile-ttl 對已設定過期時間的資料 挑選即将過期的資料淘汰

4.0 中新增2種 volatile-lfu allkeys-lfu 通過通路頻率淘汰 least frquency used

可設定鍵的過期時間,鍵過期的時候 會自動删除該鍵