一共有如下值mysql
如今來一一驗證如下值的區別以及產生這些值的條件sql
建立表數據庫
create table test_order
(
id int auto_increment primary key,
user_id int,
order_id int,
order_status tinyint,
create_date datetime
);
create table test_orderdetail
(
id int auto_increment primary key,
order_id int,
product_name varchar(100),
cnt int,
create_date datetime
);
create index idx_userid_order_id_createdate on test_order(user_id,order_id,create_date);
create index idx_orderid_productname on test_orderdetail(order_id,product_name);
複製代碼
而後執行存儲過程 分別生成2張表各 50w條記錄緩存
CREATE PROCEDURE `test_insertdata`(IN `loopcount` INT) LANGUAGE SQL NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER COMMENT '' BEGIN declare v_uuid varchar(50); while loopcount>0 do set v_uuid = uuid(); insert into test_order (user_id,order_id,order_status,create_date) values (rand()*1000,id,rand()*10,DATE_ADD(NOW(), INTERVAL - RAND()*20000 HOUR)); insert into test_orderdetail(order_id,product_name,cnt,create_date) values (rand()*100000,v_uuid,rand()*10,DATE_ADD(NOW(), INTERVAL - RAND()*20000 HOUR)); set loopcount = loopcount -1; end while; END 複製代碼
執行函數 使用bash
call test_insertdata(500000);
//或者mysql 客戶端點擊 運行函數 輸入50w 便可
複製代碼
explain select user_id,order_id,create_date from test_order where user_id = 1; 複製代碼
因此觸發Using index 必須知足2個條件markdown
==1. 查詢列被索引覆蓋,==函數
==2. where條件 是 索引前導列(最左原則)==oop
explain select user_id,order_id,create_date from test_order where order_id = 1; 複製代碼
explain select user_id,order_id,create_date from test_order where order_id >1 and order_id < 5; 複製代碼
explain select user_id from test_order where id =1; 複製代碼
explain select user_id,order_id,order_status,create_date from test_order where user_id =1; 複製代碼
explain select user_id,order_id,order_status,create_date from test_order where order_id =1; 複製代碼
explain select user_id,order_id,order_status,create_date from test_order where order_status =1; 複製代碼
using where 說明是經過索引或者表掃描的方式進行where 條件的過濾。反過來講,沒有可用的索引查找,因此也須要考慮索引加回表 與 全表掃描之間的代價,若是type 爲all 則是全表掃描的意思ui
explain select user_id,order_id,order_status,create_date from test_order where user_id >1 and user_id < 5; 複製代碼
索引2大類 彙集索引以及 普通索引atom
B+數結構如圖
1-9
<>
1-5 7-9
<> <>
1 5 7 9
1 5 7 9
A D G J
B E H K
C F I L
複製代碼
如上所示 彙集索引最終指向的是行記錄數據
咱們來看一下 普通索引
B+數結構如圖
a - z
<>
A-F G-L
A F G L
1 5 7 9
複製代碼
如上所示 是指向該記錄的索引 因此若是想要查詢這個記錄 咱們須要==回表==的方式進行再一次查詢彙集索引
mysql 事務的實現
A atomicity 原子性 概述:將一個事務視爲最小單位 要麼所有成功,要麼總體失敗 實現:當事務發生異常的時候,就須要回滾操做,而使用 undo log 來記錄 以前操做的語句 -- 若是一旦發生異常,將會執行undo log 裏面的語句, 這裏要注意的是 undo log 記錄的是 反向操做語句 好比insert 對應的是 delete
事務的狀態 begin commit failed C Consistency 一致性 一致性的2個理解
I Isolation 隔離性 概念:在mysql 並行執行事務的時候,保證可以有序的進行事務執行,則事務須要具有隔離性 實現 鎖 悲觀鎖,樂觀鎖 杭鎖 表鎖 行鎖 共享鎖 互斥鎖 4中隔離級別以及衍生處的 幻讀,不可重複讀 髒讀
D Durability 持久性 概念:當一個事務提交後,還沒來的急寫進磁盤就宕機,則再下一次數據庫重啓時可以恢復數據,這就是持久性 實現:經過 redo log 重作日誌來實現
mysql 執行事務的過程,將行記錄從磁盤寫到內存中,更新內存中的數據,生成一條重作日誌 將修改後的數據寫入 redo buffer ,當事務執行時,進而將其寫入重作日誌中,並將緩存中的數據更新到磁盤中。由於重作日誌是512字節 與磁盤扇區大小相同,就能夠保證原子性,不會由於斷電而寫入一半的這種狀況。因此當重啓後,mysql會從重作日誌中從新執行mysql命令,這就是持久性