索引的特點(diǎn)
MySQL中索引的儲(chǔ)存結(jié)構(gòu)有兩種:B 樹(shù)結(jié)構(gòu)和 HASH 結(jié)構(gòu)拾弃,具體和表的儲(chǔ)存引擎相關(guān):MylSAM 和INNODB 儲(chǔ)存引擎只支持 B 樹(shù)結(jié)構(gòu)的索引; 還有另外兩種 Memory 儲(chǔ)存引擎和 Archive 儲(chǔ)存引擎摆霉。
索引的優(yōu)點(diǎn):
1.通過(guò)創(chuàng)建唯一索引豪椿,可以保證數(shù)據(jù)庫(kù)表中每一行數(shù)據(jù)的唯一性奔坟。
2.可以大大加快數(shù)據(jù)的查詢(xún)速度。
3.在實(shí)現(xiàn)數(shù)據(jù)的引用完整性方面搭盾, 可以加速表盒表之間的連接咳秉。
4.在使用分組和排序進(jìn)行查詢(xún)數(shù)據(jù)時(shí),也可以顯著減少查詢(xún)中分組和排序的時(shí)間鸯隅。
索引的缺點(diǎn):
1.創(chuàng)建索引和維護(hù)索引要耗費(fèi)時(shí)間澜建。
2.索引需要占用磁盤(pán)空間,除了數(shù)據(jù)表占數(shù)據(jù)空間之外蝌以,每一個(gè)索引還要占一定的物理空間(InnoDB 數(shù)據(jù)表上的索引是表空間的一個(gè)組成部分),如果有大量的索引炕舵,索引文件可能比數(shù)據(jù)文件更快達(dá)到最大文件尺寸。占時(shí)間跟畅,占空間咽筋。
3.索引也會(huì)動(dòng)態(tài)的維護(hù),這樣就降低了數(shù)據(jù)的維護(hù)速度徊件。
索引的分類(lèi)
1.普通分類(lèi)
普通索引是 MySQL 中的基本索引類(lèi)型奸攻,允許在定義索引的列中插入重復(fù)值和空值。
2.唯一索引
索引列的值必須唯一虱痕,但允許有空值(但只能有一個(gè))
3.主鍵索引
主鍵索引是一種特殊的唯一索引睹耐,不允許有空值。主鍵索引一定是唯一索引部翘,但是唯一索引不一定是主鍵索引硝训。
4 組合索引
組合索引指在表的多個(gè)字段組合上包上創(chuàng)建的索引,只有在查詢(xún)條件中使用了這些字段的左法字段時(shí)新思,案引才會(huì)被使用捎迫。使用組合索引時(shí)遵循龍前綴集合。
創(chuàng)建組合索引時(shí)需要注意以下三點(diǎn):
A. 當(dāng)需要頻繁地將兩列或多列作為個(gè)整體進(jìn)行搜索時(shí)表牢,可以創(chuàng)建組合索引。
B. 創(chuàng)建組合索引時(shí)先列出唯一性最好的列贝次。
C. 組合索引中列的順序和數(shù)量會(huì)影響查詢(xún)的性能崔兴。
- 全文索引
全文索引類(lèi)型為FULLTEXT,在定義索引的列上支持值的全文查找,允許在這些索引列中插入重復(fù)值和空值蛔翅。全文索引可以在CHAR敲茄、VARCHAR或者TEXT類(lèi)型的列上設(shè)置,同時(shí)在MySQL中只有MyISAM存儲(chǔ)引擎支持全文索引山析。 - 空間索引
空間索引是對(duì)空間數(shù)據(jù)類(lèi)型的字段建立的索引堰燎,MySQL中的空間數(shù)據(jù)類(lèi)型有4種,分別是:GEOMETRY笋轨、POINT秆剪、 LINESTRING 和POLYGON赊淑。MySQL使用SPATIAL關(guān)鍵字進(jìn)行擴(kuò)展,使得能夠用于創(chuàng)建正規(guī)索引類(lèi)似的語(yǔ)法創(chuàng)建空間索引仅讽。創(chuàng)建控件索引的字段陶缺,必須設(shè)置NOT NULL約束, 空間索引只能在存儲(chǔ)引擎為MyISAM的表中創(chuàng)建洁灵。
索引的設(shè)計(jì)原則:
1.索引并非越多越好饱岸,一個(gè)表中如果有大量的索引,不僅占用磁盤(pán)空間徽千,而且會(huì)影響 INSERT 苫费、DELETE 、UPDATE 等語(yǔ)句的性能双抽,因?yàn)楫?dāng)表中數(shù)據(jù)更改時(shí)百框,索引也會(huì)進(jìn)行調(diào)整和更新。
2.避免對(duì)經(jīng)常更新的列設(shè)置索引荠诬,并且索引中的列進(jìn)可能的少琅翻。而對(duì)經(jīng)常用于查詢(xún)的字段應(yīng)該創(chuàng)建索引,但要避免添加不必要的字段柑贞。
3.數(shù)據(jù)量小的表最好不要使用索引方椎,由于數(shù)據(jù)較少,查詢(xún)花費(fèi)的時(shí)間可能比遍歷索引的時(shí)間還短钧嘶,索引可能不會(huì)產(chǎn)生優(yōu)化效果棠众。
4.在不同值較少的字段上不必要建立索引,如性別字段有决。
create database two20210611 default charset=utf8;
use two20210611;
create table student (
studentid char(10) PRIMARY key,
studentname varchar(10) not null,
gender varchar(2) ,
age int ,
index(studentname)
);
show create table student;
insert into student values ('1' , '丘處機(jī)' , '男' , 46 );
select * from student;
-- 執(zhí)行計(jì)劃 explain
explain select * from student where studentname="丘處機(jī)";
-- 組合索引
create table student2 (
studentid char(10) PRIMARY key,
studentname varchar(10) not null,
age int ,
city varchar(10),
dormitoryNo varchar(5), # 宿舍編號(hào)
index MultiIndex(city,dormitoryNo) # 組合索引
);
show create table student2;
insert into student2 values ('1' , '楊過(guò)' , 19 , '活死人墓' , '002') ;
select * from student2 where studentname="楊過(guò)";
explain select * from student2 where studentname="楊過(guò)";
select * from student2 where city="活死人墓" and dormitoryNo ='002';
explain select * from student2 where city="活死人墓" and dormitoryNo ='002';
-- 刪除索引
alter table student drop index studentname;
-- 創(chuàng)建索引
create index studentname on student(studentname) ;
-- 事務(wù)
create table user(
u_name varchar(20) ,
unique(u_name)
);
insert into user values ("小龍女");
select * from user;
begin;
insert into user values ("李莫愁");
commit;
begin; -- 事務(wù)的開(kāi)始
insert into user values ("尹志平");
commit; -- 事務(wù)的結(jié)束
begin ;
insert into user values ("郭靖");
rollback; -- 回滾
-- 回滾點(diǎn)
begin;
insert into user values ("A");
savepoint first_point;
insert into user values ("B");
rollback to savepoint first_point;
insert into user values("C");
commit;
select * from user ;