Mysql基礎 索引 事務

2021-09-24 07:08:38 字數 3980 閱讀 4100

索引用於快速找出在某個列中有一特定值的行,不使用索引,mysql必須從第一條記錄開始讀完整個表,直到找出相關的行,表越大,查詢資料所花費的時間就越多,如果表中查詢的列有乙個索引,mysql能夠快速到達乙個位置去搜尋資料檔案,而不必檢視所有資料,那麼將會節省很大一部分時間。

例如:有一張person表,其中有2w條記錄,記錄著2w個人的資訊。有乙個phone的字段記錄每個人的**號碼,現在想要查詢出**號碼為***x的人的資訊。

如果沒有索引,那麼將從表中第一條記錄一條條往下遍歷,直到找到該條資訊為止。

如果有了索引,那麼會將該phone欄位,通過一定的方法進行儲存,好讓查詢該字段上的資訊時,能夠快速找到對應的資料,而不必在遍歷2w條資料了。其中mysql中的索引的儲存型別有兩種:btree、hash。也就是用樹或者hash值來儲存該欄位,要知道其中詳細是如何查詢的,就需要會演算法的知識了。我們現在只需要知道索引的作用,功能是什麼就行。

建表

create table t16 (

name char(10),

email char(20),

key name(name),

unique key email(email)

)engine myisam charset utf8;

複製**

這裡name欄位使用key作為普通索引 eamil欄位作為唯一索引

插入資料

insert into t16 

values

('lisi', '[email protected]');

複製**

如果再次插入上面的資料,就會報錯,因為unique key不能重複

insert into t16 

values

('lisi', '[email protected]');

複製**

例如在2.1表的基礎上增加id欄位

create table t17 (

id int,

name char(10),

email char(20),

primary key (id),

key name(name),

unique key email(email)

)engine myisam charset utf8;

複製**

建立索引時,可以索引列的前一部分內容,比如,只索引前10個字元

建表

create table t18 (

name char(10),

email char(20),

unique key email(email(10))

)engine myisam charset utf8;

複製**

這裡只取eamil的前十個字元作為索引

就是把2列或者多列的值看成整體,建立索引,例如

create table t19 (

xing char(2),

ming char(10),

key xm(xing, ming)

)engine myisam charset utf8;

複製**

這裡的key xm(xing, ming)就建立了多列索引 檢視索引

show index from t19 \g;

複製**

其中key_name代表索引名,column_name代表生效的列名

insert into t19 values ('朱', '元璋');

複製**

需要注意的是,注意以下兩個句子的對比

select * from t19 where xing="朱" and ming="元璋";

複製**

這條查詢語句會用到索引

select * from t19 where ming="元璋";

複製**

這條語句索引是不會發生作用的 請看下圖

explain select * from t19 where ming='元璋' \g;

複製**

記住索引的原則就是左字首,比如朱開頭,在左邊,就能有索引,元璋是右邊的,所以無法根據右半部分無法建立索引,因為可能還有叫李元璋,張元璋,根本不知道左邊是誰,但是根據左邊能推出右邊是誰。

show index from 表名或create table 表名也能看到

複製**

alter table 表名 drop index 索引名

或者drop index 索引名 on 表名

複製**

alter 表名 add[index/unique]索引名(列名)

新增主鍵索引

alter 表名 add primary key(列名)

複製**

刪除主鍵索引

alter table 表名 drop primairy key

複製**

transaction

事務:乙個最小的不可再分的工作單元;通常乙個事務對應乙個完整的業務(例如銀行賬戶轉賬業務,該業務就是乙個最小的工作單元)

乙個完整的業務需要批量的dml(insert、update、delete)語句共同聯合完成 事務只和dml語句有關,或者說dml語句才有事務。這個和業務邏輯有關,業務邏輯不同,dml語句的個數不同

建立1個表,用來觀察事務的特徵

# 表1 注意mysql引擎是innodb,myisam不支援事務

create table account(

id int,

name char(10),

money int

)engine innodb charset utf8;

複製**

表1插入資料

insert into account values 

(1, 'zhangsan', 5000);

insert into account values

(2, 'lisi', 5000);

複製**

# 開啟事務

start transaction;

# 給lisi加500

update account set money=money+500 where id=2;

複製**

此時,我們再開乙個命令列視窗,檢視account賬戶情況

注意這裡account並沒有給lisi加上那500 接著執行命令

# 給zhangsan減去500

update account set money=money-500 where id=1;

# 提交事務

commit;

複製**

然後我們檢視account表的資料

這既是隔離性,事務裡面的狀態並不會實時影響到這張表的資料,事務只顯示事務前和事務提交成功後的狀態。

原子性就是,如果我們事務中其中一項執行失敗,則回滾到初始狀態

# 開啟事務

start transaction;

# 給lisi加500

update account set money=money+500 where id=2;

# 此時我們想結束這個事務,並且狀態還原

rollback;

複製**

一致性指的是,前後的資料改變必須一致。比如給zhangsan+500,肯定是從lisi那裡扣的500也就是-500,,所以必須資料的改變要一致

mysql索引和事務 MySql索引和事務

mysqlde 索引 目的 是為了加快查詢的速度,避免順序查詢,但是拖慢了插入和刪除的速度.應用在在經常查詢,很少少出插入的場景中.結構 b 樹,n叉搜尋樹,使用鏈式的結構把每一層的節點連線在一起,葉子節點中儲存資料,非葉子節點輔助查詢.主鍵索引和其他索引的不一樣 主鍵索引葉子節點儲存一條一條的資料...

mysql事務索引 mysql事務索引和許可權管理

pysql sql注入 太相信使用者輸入的所有的資料。解決方法 1.自己手動去判斷轉義使用者輸入的資料2.不要拼接sql語句,使用pymysql 的execute方法,防止sql的注入。事務 一組操作,要麼都成功要麼都失敗 四大特性 1.原子性 原子是最小的粒度,所以說一組操作要麼都 成功要麼都失敗...

MySQL事務 索引

一 事務處理步驟 set autocommit 0 關閉mysql的自動提交 start transaction 開始乙個事務,標記事務的起點 commit 提交乙個事務給資料庫 rollback 將事務回滾,所有commit中的操作將取消 set autocommit 1 還原mysql資料庫自動...