[TOC]
# :-: **數據庫三大范式是什么**
第一范式:每個列都不可以再拆分。
第二范式:在第一范式的基礎上,非主鍵列完全依賴于主鍵,而不能是依賴于主鍵的一部分。
第三范式:在第二范式的基礎上,非主鍵列只依賴于主鍵,不依賴于其他非主鍵。
在設計數據庫結構的時候,要盡量遵守三范式,如果不遵守,必須有足夠的理由。比如性能。事實上我們經常會為了性能而妥協數據庫的設計。
# :-: **MySQL存儲引擎MyISAM與InnoDB區別**
mysql引擎有9種:一般常用的有2種Innodb,MyISAM

**Innodb引擎:** Innodb引擎提供了對數據庫ACID事務的支持。并且還提供了行級鎖和外鍵的約束。它的設計的目標就是 處理大數據容量的數據庫系統。
**主要特性有:**
* [ ] 支持事務回滾,確保數據的一致性要求
* [ ] 災難恢復性好
* [ ] 為處理巨大數據量的最大性能設計
* [ ] 實現了緩沖管理,不僅能緩沖索引也能緩沖數據,并且會自動創建散列索引以加快數據的獲取
* [ ] 支持外鍵完整性約束。存儲表中的數據時,每張表的存儲都按逐漸順序存放,如果沒有顯示在表定義時指定主鍵,InnoDB會為每一行生成一個6B的ROWID,并以此作為主鍵。
* [ ] 被用在眾多需要高性能的大型數據庫站點上
**MyISAM引擎:** 基于 ISAM 的存儲引擎,并對其進行擴展。它是在Web、數據存儲和其他應用環境下最常使用的存儲引擎之一。MyISAM 擁有較高的插入、查詢速度,但不支持事務。在 MySQL5.5.5 之前的版本中,MyISAM 是默認的存儲引擎。
**主要特性有:**
* [ ] 不支持事務
* [ ] 使用表級鎖,并發性差
* [ ] 主機宕機后,MyISAM表易損壞,災難恢復性不佳
* [ ] 可以配合鎖,實現操作系統下的復制備份、遷移
* [ ] 只緩存索引,數據的緩存是利用操作系統緩沖區來實現的。可能引發過多的系統調用且效率不佳
* [ ] 數據緊湊存儲,因此可獲得更小的索引和更快的全表掃描性能
* [ ] 可以把數據文件和索引文件放在不同目錄
* [ ] 使用 MyISAM 引擎創建數據庫,將產生3個文件。文件的名字以表的名字開始,擴展名指出文件類型:frm 文件存儲表定義,數據文件的擴展名為 .MYD(MYData),索引文件的擴展名是 .MYI(MYIndex)。
### 應用場景
如果沒有特別的需求,使用默認的`Innodb`即可。
MyISAM:以讀寫插入為主的應用程序,比如博客系統、新聞門戶網站。
Innodb:更新(刪除)操作頻率也高,或者要保證數據的完整性;并發量高,支持事務和外鍵。比如OA自動化辦公系統。
# :-: **MySQL事務**
**四大特性**:`原子性`、`隔離性`、`一致性`、`持久性`簡稱 ACID,缺一不可。
MySQL 事務主要用于處理操作量大,復雜度高的數據。比如說,在人員管理系統中,你刪除一個人員,你既需要刪除人員的基本資料,也要刪除和該人員相關的信息,如信箱,文章等等,這樣,這些數據庫操作語句就構成一個事務!
在 MySQL 中只有使用了 Innodb 數據庫引擎的數據庫或表才支持事務。
事務處理可以用來維護數據庫的完整性,保證成批的 SQL 語句要么全部執行,要么全部不執行。
事務用來管理 insert,update,delete 語句
一般來說,事務是必須滿足4個條件(ACID)::原子性(Atomicity,或稱不可分割性)、一致性(Consistency)、隔離性(Isolation,又稱獨立性)、持久性(Durability)。
**原子性**: 一個事務(transaction)中的所有操作,要么全部完成,要么全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。
**一致性:** 在事務開始之前和事務結束以后,數據庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設規則,這包含資料的精確度、串聯性以及后續數據庫可以自發性地完成預定的工作。
**隔離性:** 數據庫允許多個并發事務同時對其數據進行讀寫和修改的能力,隔離性可以防止多個事務并發執行時由于交叉執行而導致數據的不一致。事務隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重復讀(repeatable read)和串行化(Serializable)。
**持久性:** 事務處理結束后,對數據的修改就是永久的,即便系統故障也不會丟失
# :-: **MySQL事務隔離級別的實現原理**
PS:事務隔離級別是MySQL事務四大特性中的隔離性
SQL 標準定義了四種隔離級別,MySQL 全都支持。這四種隔離級別分別是:
1. 讀未提交(READ UNCOMMITTED)-臟讀
2. 讀提交 (READ COMMITTED)
3. 可重復讀 (REPEATABLE READ)-幻讀
4. 串行化 (SERIALIZABLE)
從上往下,隔離強度逐漸增強,性能逐漸變差。采用哪種隔離級別要根據系統需求權衡決定,其中,**可重復讀**是 MySQL 的默認級別。
事務隔離其實就是為了解決上面提到的臟讀、不可重復讀、幻讀這幾個問題,下面展示了 4 種隔離級別對這三個問題的解決程度。
| 隔離級別 | 臟讀 | 不可重復讀 | 幻讀 |
| --- | --- | --- | --- |
| 讀未提交 | 可能 | 可能 | 可能 |
| 讀提交 | 不可能 | 可能 | 可能 |
| 可重復讀 | 不可能 | 不可能 | 可能 |
| 串行化 | 不可能 | 不可能 | 不可能 |
只有串行化的隔離級別解決了全部這 3 個問題,其他的 3 個隔離級別都有缺陷
# :-: **索引**
### **什么是索引?**
索引是一種特殊的文件(InnoDB數據表上的索引是表空間的一個組成部分),它們包含著對數據表里所有記錄的引用指針。
索引是一種數據結構。數據庫索引,是數據庫管理系統中一個排序的數據結構,以協助快速查詢、更新數據庫表中數據。索引的實現通常使用B樹及其變種B+樹。
更通俗的說,索引就相當于目錄。為了方便查找書中的內容,通過對內容建立索引形成目錄。索引是一個文件,它是要占據物理空間的。
### **索引有哪些優缺點?**
索引的優點
* 可以大大加快數據的檢索速度,這也是創建索引的最主要的原因。
* 通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的性能。
索引的缺點
* 時間方面:創建索引和維護索引要耗費時間,具體地,當對表中的數據進行增加、刪除和修改的時候,索引也要動態的維護,會降低增/改/刪的執行效率;
* 空間方面:索引需要占物理空間。
- PHP書寫規則
- 代碼縮進
- 大括號{ }書寫規則
- 變量賦值對齊
- if條件判斷規范
- 避免嵌入式賦值
- 函數和方法的注釋
- 項目規范
- 業務邏輯logic
- model模型
- 控制器
- view視圖
- 定制項目開發
- 接口輸出變量格式
- mysql設計規范
- 二維碼系列
- php 用phprqcode 生成簡單的二維碼
- 小程序二維碼
- 其他小工具
- 獲取單個漢字拼音首字母
- js 調起打印多出一張空白的問題?
- php 2張圖片合拼
- 判斷一個漢字可以等于1個字符,2個字符,3個字符
- 微信小程序獲取頁面路徑
- 小程序js、canvas實現矩形圓角、圓形頭像圖片
- php phpMailer 發送郵件(親測有效)
- 系統配置表
- php 用tcpdf 生成pdf
- PHP mkdir():創建目錄
- php 通過svg動態生成生成后綴圖標
- php 本地安裝SSL證書
- php 生成首字母頭像
- php 接口數據壓縮返回,減少帶寬
- PHP向二維數組多維數組追加相同元素
- php 指定時間戳上加上一天,一個月,一年的方法
- Spreadsheet 表格生成
- php 多維數組排序 多維數組按照某個字段排序
- php根據開始和結束時間獲取期間日期
- php 獲取本周、上周、本月、上月及指定時間所在周、月的起止時間
- php GeoIP2通過ip獲取國家和地區城市
- 奇葩報錯問題
- session賦值報錯
- 服務器配置lnmp
- 開啟mysql binglog 日志
- lnmp 開啟遠程訪問3306
- 開啟mysql 慢日志查詢
- 開通Liunx 3306 端口(遠程連接開放)
- 搭建lnmp
- liunx 多臺服務器搭建共享文件夾圖片文件夾
- liunx 操作命令1
- nginx專區
- 禁止外部ip訪問
- 強制跳轉到https
- mysql專區
- 版本5.7報錯 only_full_group_by
- 把同一張表的一個字段的內容復制到另一個字段里
- lnmp關閉嚴格模式
- mysql 兩張不同結構的表連表查詢,合并,并分頁,排序 教你如何實現UNION
- mysql 查詢一張表中某個字段不同狀態的數量統計
- mysql數據庫快速插入百萬條級別的測試數據
- MySQL EXPLAIN 詳解,可用EXPLAIN來分析優化數據庫sql語句
- mysql 三星索引
- mysql 返回數據排名查詢獲取排名的方法,親測有效
- mysql使用查詢出來的值并且更新update新的表報錯?叫你一招
- mysql 怎樣自定義in查詢操作排序
- mysql 百萬級別和千萬級數據分頁查詢性能優化
- mysql 查詢某個字段按照逗號分割返回
- mysql 用sql命令導入數據庫
- mysql 根據某個字段的值匹配替換某個值
- Mysql中分組后取最新的一條數據排序
- Certbot-免費的https證書
- session_start()報錯問題
- 文件大打不開?代碼實現分割
- windows服務器專區
- apache 突然重啟動不了
- windows 定時任務
- liunx專區
- liunx 定時器檢查php是否能訪問,重啟
- liunx 操作命令
- 定時器 tp5 命令行
- liunx查看端口是否開放
- liunx上傳或者下載本地文件
- 前端
- jq克隆html
- Jquery添加元素(append,prepend,after,before四種方法區別對比)
- 小程序switch樣式修改
- css div 里面模塊 平均展開
- 安全小學堂
- 驗證碼一次一碼
- 實戰thinkphp6
- 前言
- 中間件
- 開啟多語言
- RabbitMQ 專區
- 下載RabbitMQ
- ftp專區
- Linux安裝vsftpd及配置詳解
- 小程序欄目
- 微信小程序封裝統一接口請求api數據
- 云數據庫
- 小程序云開發更新云函數數組的某一項,并且某個是變量代替
- php面試總結
- Mysql面試
- PHP面試知識
- Thinkphp框架小知識
- fastadmin 文檔
- fastadmin js 渲染 動態下拉(SelectPage)組件
- fastadmin 列表搜索欄 支持三級聯動 地區選項
- fastadmin searchList組件自定義數據返回
- 開發工具
- phpstorm 一直在Indexing,一直加載索引,無法正常使用
- PHP專區
- session 工作流程
- Redis
- php redis 基本操作
- SourceTree 3.3.9跳過注冊安裝
- composer 專區
- 手把手教你寫一個composer包
- freessl證書申請