夯實基礎系列三:數據庫知識總結

前言

前兩節內容傳送門:
夯實基礎系列一:Java 基礎總結
夯實基礎系列二:網絡知識總結html

對於後端開發人員來講,常常會和數據打交道,今天總結下數據庫相關的知識。包括MySQL,JDBC基礎,JDBC進階,MongoDB,性能優化。如下對這些內容作一些簡單的總結,同時我也有完整的思惟導圖,博客上不方便展現,如有須要,請關注微信公衆號永倫的小屋,後臺回覆 數據庫 便可獲取。java

MySql 大綱

JDBC

JDBC 進階

細節

1. MySQL

1.1 數據庫的概述
  • DBMS
    • 解釋:關係型數據庫管理系統
    • 庫管+N個倉庫
  • 常見的數據庫管理系統
    • MySQL
    • Orcale
    • DB2
    • SQL Server
    • Sybase
1.2 安裝MySQL
  • 目錄結構
    • mysql.exe:客戶端
    • mysqld.exe:服務器
    • my.ini:總配置文件
  • 在windows下開戶和關閉mysql服務器
    • net start mysql
    • net stop mysql
  • 登陸和退出mysql客戶端
    • mysql -u用戶名 -p密碼 -hIP
    • exit或quit
1.3 SQL
  • 概述
    • 解釋:結構化查詢語言
    • ISO:國際標準化組織
    • ISO 定義了不少 SQL 標準,例如:SQL99
    • 各個數據庫廠商須要遵循這個標籤!但各個廠商也有本身的方言
  • SQL的分類
    • DDL:數據定義語言
    • DML:數據操做語言
    • DCL:數據控制語言
    • DQL(不在標準中):數據查詢語言
1.4 DDL
  • 數據庫的操做
    • create database
    • show databases
    • use mydb1
    • alter database
    • drop database
  • 表的操做
    • create table
    • show tables
    • desc mytable1
    • drop table
    • alter table
      • add
      • modify
      • change
      • drop
      • rename to
1.5 DML
  • 插入記錄
  • 修改記錄
  • 刪除記錄
    • delete
    • truncat
1.6 DCL
  • 建立用戶
  • 受權
  • 撤消權限
  • 查看權限
  • 刪除用戶
1.7 DQL
  • 基本查詢
    • 查看整張表
      • select * from 表名
    • 列控制
      • 列運算:select sal * 1.5 from emp
      • 列運算:鏈接字符串:select concat('個人名稱是', ename) from emp
      • 處理 NULL 值:select sal + IFNULL(comm, 0) from emp
      • select ename 姓名 from emp
      • 去除徹底重複的行:select distinct comm from emp
  • 條件查詢
    • 模糊查詢
      • 下劃線
      • 百分號
  • 排序
    • desc
    • asc
  • 聚合函數
    • count
    • min
    • max
    • sum
    • avg
  • 分組
    • group by
    • having
  • limit
1.8 約束
  • 約束保證數據的完整性和一致性
  • 約束分爲表級約束和列級約束
    • 對一個數據列創建的約束,列級約束
    • 對多個數據列創建的約束,表級約束
  • 約束類型包括:
    • NOT NULL
    • PRIMARY KEY
    • UNIQUE KEY
    • DEFAULT
    • FOREIGN KEY
1.9 中文沒法插入解決辦法
  • dos 下不支持直接使用 utf8,set names gbk,再插入便可。
1.10 鏈接類型
  • 內鏈接
    • 顯示左表及右表符合鏈接條件的記錄
  • 左外鏈接
    • 顯示左表的所有記錄及右表符合鏈接條件的記錄
  • 右外鏈接
    • 顯示右表的所有記錄及左表符合鏈接條件的記錄
  • 自身鏈接
    • 同一個數據表對其自身進行鏈接

2. JDBC

2.1 JDBC 的原理
  • 是由 JavaEE 提供的鏈接數據庫的規範
  • 須要由各大數據庫的廠商提供對 JDBC 的實現類
2.2 四大核心類
  • DriverManagermysql

    • getConnection
  • Connectionlinux

    • createStatement
    • prepareStatement(String sql)
  • Statementgit

    方法:
    ​ 1.executeUpdate()-->增、刪、改 
    ​ 2.executeQuery()-->查
    ​ 3.addBatch(String sql)
    ​ 4.executeBatch()
    ​ 5.execute(String sql)github

  • ResultSetsql

    • getXxx()系統方法
    • 移動光標系統方法
2.3 四大參數
  • driverClassName
  • url
  • username
  • password
2.4 預編譯語句集
  • 防SQL攻擊
  • 可讀性提升了
  • 效率高
2.5 DAO模式
  • 面向接口編程
    • DAO接口
    • DAO實現,能夠提供多個實現
    • DAO工廠
    • DAO配置文件:提供實現類名稱
2.6 時間類型的轉換
  • 領域對象中的日期時間,必須爲 util 的Date
  • 在 JDBC 中使用的都是 sql 的 Date
  • insert、update、delete,須要把領域對象中的 util 的 Date 轉換成 sql 的 Date
  • 在 select 時,須要把 sql 的 Date 賦給領域對象的 util 的 Date 類型的屬性,這不須要處理
2.7 大數據存取
  • 把文件轉換成 Blob 類型
  • 把 Blob 類型轉換成文件
2.8 批處理
  • 添加批
  • 執行批

3. JDBC_進階

3.1 事務
  • ACIDmongodb

    • 原子性
    • 一致性
    • 隔離性
    • 持久性
  • mysql 中開啓和關閉事務數據庫

    • 開啓事務:START TRANSACTION
    • 結束事務
      • 提交事務:COMMIT
      • 回滾事務:ROLLBACK
  • JDBC 中開啓和關閉事務編程

    • 開啓事務:connection.setAutoCommit(false)
    • 結束事務
      • connection.commit()
      • connection.rollback()
  • 格式:

    try {
    ​ con.setAutoCommit(false);//開始事務
    ​ ...
    ​ con.commit();//提交事務
    ​ } catch(...) {
    ​ con.rollback();//回滾事務
    ​ }

3.2 三種併發讀問題
  • 髒讀
    • 讀到未提交
  • 不可重複讀
    • 兩次讀取不一致,讀取到另外一事務修改的記錄
  • 幻讀
    • 兩次讀取不一致,讀取到另外一事務插入的記錄
3.3 四種隔離級別
  • 串行化
  • 可重複讀
    • 防止了髒讀、不可重複讀 MySQL
  • 讀已提交
    • 防止了髒讀 Oracle
  • 讀未提交
3.4 鏈接池
  • 必須實現 javax.sql.DataSource
  • DBCP
  • C3P0
3.5 JNDI
  • 在 tomcat 的 conf/catalina/localhost 下建立 xml 文件
    • 配置 元素
    • 中配置 元素
  • 在代碼中使得 Context 類的 lookup 方法來獲取資源
    • java:comp/env/ 資源名稱
3.6 ThreadLocal
  • 內部有一個 Map
    • key 是當前線程

4. MongoDB

4.1 MongoDB 安裝
  • 在 github 上獲取源碼包 mongo-r2.6.5.zip
  • 解壓縮

unzip mongo-r2.6.5.zip

  • 編譯源碼文件

cd mongo-r2.6.5

scons all -j 12 //12 爲 CPU 核數,用來加速編譯過程

若未安裝 scons,使用命令 sudo apt-get install scons

4.2 編譯後的文件
  • mongod:mongodb 的啓動文件,用來部署數據庫
  • mongo:連接服務器的客戶端
  • mongoimport,,mongoexport:用來導入導出數據庫
  • mongodump,mongorestore:用來導入導出二進制數據,通常用來數據的備份與恢復。
  • mongooplog 操做日誌
  • mongostat:用來查看 mongodb 服務器的各類狀態。
4.3 MongoDB 搭建
  • 創建相關目錄

    • data (用於存放數據文件)
    • log(用於存放日誌文件)
    • conf(用於存放數據庫配置文件 mongod.conf)
    • bin(用於存放數據庫可執行文件 mongod)
  • 編輯配置文件

    mongod.conf{
    ​ port = 12345 /監聽端口/
    ​ dbpath = data /指定數據文件/
    ​ logpath = log/mongod.log /指定日誌文件/
    ​ fork = ture /linux後臺運行標誌,window無效/
    ​ }

  • 運行程序

mongod -f conf/mongod.conf /運行mongod 加載指定配置文件/

  • 查看運行狀態

    data 和 log 目錄
    ​ tail mongod.log /查看日誌/

4.4 MongoDB 鏈接
操做:
一、拷貝到指定目錄 :cp mongo bin
二、執行程序 mongo 127.0.0.1:12345/test(ip端口數據庫)~
三、關閉 mongodb use admin -》db.shutdownServer(),kill -15 進程
四、從新啓動 mongodb:numactl --interleave=all bin/mongod -f conf/mongod.conf
4.5 數據庫使用
一、鏈接數據庫
/bin/mongo 127.0.0.1:12345
二、顯示數據庫
show dbs
三、切換數據庫
use imooc(庫名)
四、切換後刪除數據庫
db.dropDatabase()
五、建立數據庫
use imooc(庫名)
六、查看數據庫
show dbs
七、建立 imooc_collection 並插入數據
db.imooc_collection.insert({x:1}) -> json 數據
_id全局惟一不重複,可自行定義不重複字段
db.imooc_collection.insert({x:1,_id:1})
插入多條語句(支持js語法)
for(i=3;i<100;i++) db.imooc_collection.insert({x:i})
八、顯示錶結構
show collections
九、查詢數據表中數據
    a) 查詢全部 db.imooc_collection.find()
    b) 條件查詢(x:1的數據) db.imooc_collection.find({x:1})
    c)高級查詢
        db.imooc_collection.find().count()/*統計條數*/
        db.imooc_collection.find().skip(3).limit(2).sor({x:1})/*過濾掉前三條並限制返回2條且使用x排序*
4.6 數據更新 update
1.db.imooc_collection.update({x:1},{x:999}) #將x爲1的數據更新爲x=999
update接收兩個參數,第一個是過濾條件,這裏是x=1的數據,第二個是須要修改的目標值
2.另外一種狀況,一條數據包含三個字段值,如
>db.imooc_collection.insert({x:100,y:100,z:100})
若是直接執行>db.imooc_collection.update({z:100},{y:99}) #將z爲100的數據中的y更新爲99
這樣會將x和z覆蓋掉,只剩下y:99
爲了不這種狀況,須要:
>db.imooc_collection.update({z:100},{$set:{y:99}}) #加入set操做符
set操做符爲部分更新操做符,使用set後,內容中存在的字段會被更新,而不存在的字段會保持原狀

若是查找的數據不存在則建立:
> db.user.update({name: 'admin'}, {name: 'admin-updated'}, true)
第三個參數爲true便可

mongoDB:update方法有四個參數
第一個參數:查找數據的條件,如{c:1} 表示查找c爲1的數據
第二個參數:要更新的數據,如{c:2} 跟新符合條件的數據c爲2,默認只更新第一個符合條件的數據。
第三個參數:boolean類型,更新數據不存在時是否建立一條數據,默認爲false,設置爲true時,自動建立數據。
第四個參數:boolean類型,跟新數據時是否更新全部符合條件的數據,默認爲false,只跟新一條符合條件的數據,設置爲true時,更新全部符合條件的數據。

如db.collection.update({c:1},{$set{c:2}},false,true)
update(舊數據,{$set:新數據},false,true),只能使用部分更新操做符號$SET
4.7 MongoDB 方法API
db.test.save({1:"hello"});保存數據到test集合中
db.test.insert({1:"hello"});插入數據到test集合中(和insert功能相同) 
find:一個參數,查找數據的條件,不填則查找全部數據
update:上章說過
remove:刪除數據,一個參數(必須,不然會報錯):條件,默認刪除全部符合條件的數據。
drop:沒有參數,刪除當前數據表
count:查找數據的條數
sort:排序,一個參數,排序條件,{c:1} 根據c排序, 1爲正序,-1爲倒序。
show dbs:查詢全部數據庫
show tables:查詢數據表
show collections; 顯示當前選擇的db中的集合 
use dbname:選擇數據庫,若是數據庫不存在,在第一次保存數據的時候會建立數據庫。
4.8 命令小結
scons all
mongod -f file
mongo ip:port
show dbs
use db
show collections
db.collection.insert();
db.collection.update()
db.collection.delete()
db.collection.count();
db.collection.find()
db.collection.getIndexes()
db.collection.ensuerIndex()

5. 性能優化

5.1 MySQL 性能優化
  • 表的設計合理化(符合3NF)
    • 1NF 是對屬性的原子性約束,要求屬性(列)具備原子性,不可再分解;(只要是關係型數據庫都知足1NF)
    • 2NF 是對記錄的唯一性約束,要求記錄有唯一標識,即實體的唯一性;
    • 3NF 是對字段冗餘性的約束,它要求字段沒有冗餘。 沒有冗餘的數據庫設計能夠作到。
  • 添加適當索引(index) [四種: 普通索引、主鍵索引、惟一索引 unique、全文索引]
    • 較頻繁的做爲查詢條件字段應該建立索引
    • 惟一性太差的字段不適合單首創建索引,即便頻繁做爲查詢條件
    • 更新很是頻繁的字段不適合建立索引
    • 不會出如今 WHERE 子句中的字段不應建立索引
  • 分表技術(水平分割、垂直分割)
  • 讀寫[寫: update/delete/add]分離
  • 存儲過程 [模塊化編程,能夠提升速度]
  • 對 mysql 配置優化 [配置最大併發數 my.ini, 調整緩存大小 ]
  • mysql 服務器硬件升級
  • 定時的去清除不須要的數據,定時進行碎片整理(MyISAM)
5.2 SQL語句優化
  • 經過 show status 命令瞭解各類 SQL 的執行頻率。
  • 定位執行效率較低的 SQL 語句-(重點 select)
  • 經過 explain 分析低效率的 SQL
  • 肯定問題並採起相應的優化措施
5.3 索引
  • 索引的類型
    • 主鍵索引,主鍵自動的爲主索引 (類型 Primary)
    • 惟一索引 (UNIQUE)
    • 普通索引 (INDEX)
    • 全文索引 (FULLTEXT) [適用於MyISAM] ——》sphinx + 中文分詞 coreseek [sphinx 的中文版 ]
    • 綜合使用=>複合索引
  • 可能使用到索引
    • 對於建立的多列索引,只要查詢條件使用了最左邊的列,索引通常就會被使用。
    • 對於使用like的查詢,查詢若是是 '%aaa' 不會使用到索引, 'aaa%' 會使用到索引。
  • 不使用索引
    • 若是條件中有 or,即便其中有條件帶索引也不會使用。
    • 對於多列索引,不是使用的第一部分,則不會使用索引。
    • like 查詢是以%開頭
    • 若是列類型是字符串,那必定要在條件中將數據使用引號引用起來。不然不使用索引。(添加時,字符串必須'')
    • 若是mysql估計使用全表掃描要比使用索引快,則不使用索引。

原文連接:夯實基礎系列三:數據庫知識總結

相關文章
相關標籤/搜索