innodb 索引問題

  1. extra 值的區別:

一共有如下值mysql

  • Using index
  • using whre using index
  • null
  • using where
  • using index condition
  • using file sort

如今來一一驗證如下值的區別以及產生這些值的條件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 便可
複製代碼

Using index

  • 說明:查詢的列被索引覆蓋,而且where條件 是 ==索引的是前導列==, 則 extra 爲 Using index
explain select user_id,order_id,create_date from test_order
where user_id = 1;
複製代碼

因此觸發Using index 必須知足2個條件markdown

==1. 查詢列被索引覆蓋,==函數

==2. where條件 是 索引前導列(最左原則)==oop

Using where; Using index

  • 查詢的列被索引覆蓋,但不是前導列,則extra 爲Using where; Using index
explain select user_id,order_id,create_date from test_order where order_id = 1;
複製代碼
  • 查詢的列被索引覆蓋,可是where 篩選條件是前導列的一個範圍,一樣意味着沒法直接經過索引查找查詢結果到符合的數據
explain select user_id,order_id,create_date from test_order where order_id >1 and order_id < 5;
複製代碼

Null

  • 使用主鍵索引,則key 爲primary, extra 爲null
explain select user_id from test_order where id =1;
複製代碼
  • 查詢的列未被索引覆蓋,可是where條件篩選是索引前導列,意味着用到了索引,可是部分字段未被索引覆蓋,則須要經過回表的方式來實現
explain select user_id,order_id,order_status,create_date from test_order where user_id =1;
複製代碼

Using where

  • 查詢的列未被覆蓋,where條件不是索引的前導列
explain select user_id,order_id,order_status,create_date from test_order where order_id =1;
複製代碼
  • 查詢的列未被覆蓋,where條件不是索引
explain select user_id,order_id,order_status,create_date from test_order where order_status =1;
複製代碼

using where 說明是經過索引或者表掃描的方式進行where 條件的過濾。反過來講,沒有可用的索引查找,因此也須要考慮索引加回表 與 全表掃描之間的代價,若是type 爲all 則是全表掃描的意思ui

Using index condition

  1. 查詢的不全是 索引,搜索條件是前導列的 (範圍 <> 或者 like %)
explain select user_id,order_id,order_status,create_date from test_order where user_id >1 and user_id < 5;
複製代碼

索引2大類 彙集索引以及 普通索引atom

  1. 彙集索引一般是 主鍵索引
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個理解

  1. 同一個sql,相同的數據庫實例,則改變的行記錄是一致的
  2. 銀行存取錢操做, 這個就須要代碼中實現 實現

I Isolation 隔離性 概念:在mysql 並行執行事務的時候,保證可以有序的進行事務執行,則事務須要具有隔離性 實現 鎖 悲觀鎖,樂觀鎖 杭鎖 表鎖 行鎖 共享鎖 互斥鎖 4中隔離級別以及衍生處的 幻讀,不可重複讀 髒讀

D Durability 持久性 概念:當一個事務提交後,還沒來的急寫進磁盤就宕機,則再下一次數據庫重啓時可以恢復數據,這就是持久性 實現:經過 redo log 重作日誌來實現

mysql 執行事務的過程,將行記錄從磁盤寫到內存中,更新內存中的數據,生成一條重作日誌 將修改後的數據寫入 redo buffer ,當事務執行時,進而將其寫入重作日誌中,並將緩存中的數據更新到磁盤中。由於重作日誌是512字節 與磁盤扇區大小相同,就能夠保證原子性,不會由於斷電而寫入一半的這種狀況。因此當重啓後,mysql會從重作日誌中從新執行mysql命令,這就是持久性

相關文章
相關標籤/搜索