一、索引
1、索引
索引的概念 :索引是一個排序的列表,在列表當中存儲索引的值以及索引值對應數據所在的物理行。
索引的引用:
使用索引之后,就不需要掃描全表來定位某行的數據。
加快數據庫的查詢速度。
索引可以是表中的一列,也可以是多個列。
索引優點:
1、設置了索引之后,數據庫可以利用索引快速定位,大大提高查詢速度,這也是索引的主要原因。
2、尤其是表的數據很大,以及設計多個表查詢時,索引可以大大的提高查詢速度。
3、建立索引,不僅能夠提高查詢速度,在恢復數據庫的數據時,也能提高性能。
4、可以加快表與表之間連接查詢的速度。
索引缺點:
1、創建的索引也需要占用額外的磁盤空間,INNODB存儲引擎表數據文件和索引文件在一塊,一體的,相對來說占是空間小一點。
2、更新一個包含索引的表比沒有索引的表需要花費更多的時間,表需要更新,索引也要更新,所以速度要慢很多。
理想的做法:經常被作為搜索條件的列上面創建索引。
2、創建索引的原則和依據
1、表的主鍵和外鍵必須有索引,主鍵是唯一的,外鍵是關聯主表的,查詢時可以快速定位。
2、一張表有超過300行的數據,應該要創建索引。
3、經常與其他表進行連接的表,在連接字段上創建索引。
4、更新太頻繁的字段不適合創建索引,
5、經常作為where語句的條件列,應該創建索引,
6、經常使用group by 和 order by的字段上要創立索引。
7、選擇一個性能高的字段作為索引,字段的值不同的越多越好。
8、索引應該建立在小字段上,字符串的長度比較小的字段,對于長文本字段,超長的字段不適合建立索引。
3、索引的類型
b-tree (b-樹索引)索引:絕大部分的數據都是使用B-樹索引。
索引的左邊的列開始,到右按順序進行排列。
哈希索引:索引對應的hash值的方法獲取表的記錄行。速度比較慢,贏的方法少。
4、創建索引
1、主鍵索引:主鍵即索引
主鍵索引是一種特殊的唯一索引。
2、普通索引
在創建表的時候創建普通索引
create table member (
id int(10),
name varchar(10),
cardid int(18),
phone int(11),
address varchar(50),
remark text,
index name_index (name) #創建普通索引
);
3、唯一索引(unique index )
創建之后修改,可以用key 的方式創建 也可以使用索引方式創建
格式
create unique index 索引名 on 表名();
ALTER TABLE member add unique index phone_index (phone);
#或者
CREATE UNIQUE index cardid_index on member(cardid);
4、組合索引
組合索引:一次性給多個列創建索引,形成一個組合。
適應于被經常搜索的列
alter table member add constraint 索引名 unique (字段1,字段1,字段1);
例如
ALTER TABLE member add CONSTRAINT uc_name_address UNIQUE (name,address);
查看索引,組合索引共用一個索引名稱
使用組合索引
select * from member where name= ... and address......;
5、 查看索引
show index from 表名;
6、刪除索引
?刪除索引要先查看,根據索引名(Key_name)進行刪除
drop index 索引名稱 on 表名;
或者
alter TABLE 表名 drop index 索引名稱;
7、?全文索引
?全文索引:適用于模糊查詢,檢索大文本使用的
create fulltext index remark_index on member (remark);
數據內容
使用索引
select * from member where match(remark) against ('vip')
在創建的時候添加多個索引
create table sysvip(
id int(5) PRIMARY KEY,#主鍵索引
name varchar(10),
cardid int(11),
address varchar(50),
times timestamp,
remark text,
index name_index (name),#普通索引
unique index cardid_index (cardid), #唯一索引
FULLTEXT index remark_index (remark)#全文索引
);
查看
?
二、?mysql的事務
1、事務
事務是一個機制,一個操作序列。一組或者一條數據庫的操作命令。
把所有的命令作為一個整體向系統提交或者撤銷的操作。要么都成功要么都失敗。
數據的一致性,數據的一致性非常重要
事務是一個不可分割的工作邏輯單元,在數據庫上執行并發操作時,事務是最小的控制單元
數據庫通過事務的控制和事務的整體性保證數據的一致性。
2、事務的特點
ACID在數據庫的管理系統中,事務的特性有ACID這四種:
A:ATIMICITY 原子性:事務的最小控制單位,不可分割,要么都成功,要么都失敗
C:CONSISTENCY 一致性:事務開始之前和事務結束之后數據庫的完整性沒有被破壞
開始的時候數據是一致的,結束的時候數據也是一致的
在事務進行的時候,數據可以處于不一致的狀態,但是一旦結束,數據必須回到一致性。
I:ISOLATION 隔離性:在并發環境中,不同的事務同時操作相同的數據時,每個事務都有自己完整的數據空間。對數據的修改所發生的并發事務是隔離的,每個事務之間都是獨立的。
一個用戶的事務不被其他事務所干擾。
3、數據庫的隔離性
有以下四種:
1、未提交讀 read uncommitted RU
允許臟讀,一個事務可以看到其他事務未提交的修改
2、提交讀,read committed RC
一個事務只能看到其他事務已經提交的修改,未提交的修改不可見,防止臟讀
oracle和sql sever
3、可重復讀,repeatable read RR 一個事務在執行中,執行兩次相同的select語句,得到的結果都想同的mysql的默認隔離選項。防止臟讀和不可重復讀。
4、串行讀,相當于鎖表,完全串行化的讀,一個事務在使用,其他事務的讀寫都會阻塞。
臟讀:
查看當前會話的隔離級別
show global/session variables like '%isolation%'
修改隔離級別
set global transaction isolation level Read Uncommitted;set session transaction isolation level Read Uncommitted;
不可重復讀:在一個事務內,多次讀同一數據,一個事務沒有結束,另外一個事務也訪問該數據。
其中一個事務連續兩次查詢發現結果不一致。另外一個事務在對著這個進行修改。兩次看到的數據不一致。
set global transaction isolation level Read committed;set session transaction isolation level Read committed;
終端也要同時進行操作一樣的操作。
幻讀:一個事務對一個表的數據進行了修改,另一個表也修改了表中數據,前一個事務會返現修改的結果不正確類似于出現了幻覺。
不可更新:兩邊同時對數據進行修改,但是一方先提交,一方后提交,后提交會覆蓋先提交的。
D:DURABILITY 持久性:一旦寫入數據庫,數據不可更改。
4、事務控制語句
begin start transaction:開啟一個事務
commit :提交事務
rollback :回滾
設置回滾點:savepoint 名稱
回滾到指定的點:rollback to savepoint 名稱
可以設置多個還原點,但是只能回一次還原點,一旦提交,所有的還原點全部取消(持久性)。