创建索引的目的是优化
索引随可以提升数据库查询的速度,但并不是任何情况下都适合创建索引。因为索引本身会消耗系统资源,在有索引的情况下,数据库会先进行索引查询,然后定位到具体的数据行,如果索引使用不当,反而会增加数据库的负担。
MySQL的优化,哪些字段/场景适合创建索引,哪些不适合
create table team (id int(10),name varchar(10),cardid varchar(18),phone varchar(11),
address varchar(50),hobby text);
insert into team values (1,'lichen','250','5438','beijing','打游戏');
insert into team values (2,'liyong','110','5439','nanjing','背刺');
insert into team values (3,'zhangbin','666','9527','shenzhen','打篮球');
insert into team values (4,'liuyuan','333','5440','hangzhou','打羽毛球');
insert into team values (5,'hanxu','555','5445','shanghai','踢足球');
最基本的索引类型,没有唯一性之类的限制。
CREATE INDEX 索引名 ON 表名 (列名[(length)]);
例:
create index cardid_index on team (cardid);
select cardid from team;
show create table team;
ALTER TABLE 表名 ADD INDEX 索引名 (列名);
例:
例:alter table team add index phone_index (phone);
select phone from team;
select phone,name from team;
show create table team\G
CREATE TABLE 表名 ( 字段1 数据类型,字段2 数据类型[,...],INDEX 索引名 (列名));
例:
create table test(id int(4) not null,name varchar(10) not null,age int(3),cardid varc
har(18) not null,index age_index (age));
show create table test;
CREATE UNIQUE INDEX 索引名 ON 表名(列名);
例:
select * from team;
create unique index address_index on team (address);
create unique index name_index on team (name);
show create table team\G
ALTER TABLE 表名 ADD UNIQUE 索引名 (列名);
例:
alter table team add unique cardid_index (cardid);
CREATE TABLE 表名 (字段1 数据类型,字段2 数据类型[,...],UNIQUE 索引名 (列名));
例:
create table lcdb (id int,name varchar(20),unique id_index (id));
show create table lcdb;
create table lcdb (id int,name varchar(40),age int(5),primary key (id));
CREATE TABLE 表名 ([...],PRIMARY KEY (列名));
例:
create table lcdb1 (id int primary key,name varchar(20));
create table lcdb2 (id int,name varchar(20),primary key (id));
show create table lcdb1\G
show create table lcdb2\G
ALTER TABLE 表名 ADD PRIMARY KEY (列名);
例:
alter table lcdb1 add primary key(name);
desc lcdb1;
可以是单列上创建的索引,也可以是在多列上创建的索引。需要满足最左原则,因为select语句的 where条件是依次从左往右执行的,所以在使用select 语句查询时where条件使用的字段顺序必须和组合索引中的排序一致,否则索引将不会生效。
CREATE TABLE 表名 (列名1 数据类型,列名2 数据类型,列名3 数据类型,INDEX 索引名 (列名1,列名2,列名3));
select * from 表名 where 列名1='...' AND 列名2='...' AND 列名3='...';
例:
create table lcdb2 (id int(4),name char(30),genter char(10),age int(4),height decimal(3,1),address char(100),index index_group(id,name));
show create table lcdb\G
insert into lcdb2 values(1,'zhangsan','男',18,67,'南京');
select * from lcdb2 where name='zhangsan' and id=1;
组合索引创建的字段顺序是其触发索引的查询顺序
select id,name from test3; #会触发组合索引
而:
select name,id from test3; #按照索引从左到右检索的顺序,则不会触发组合索引
CREATE FULLTEXT INDEX 索引名 ON 表名 (列名);
例:
select * from team;
create fulltext index suoyin on team(cardid);
desc team;
ALTER TABLE 表名 ADD FULLTEXT 索引名 (列名);
例:
alter table team add fulltext index suoyin_index(name);
desc team;
CREATE TABLE 表名 (字段1 数据类型[,...],FULLTEXT 索引名 (列名));
#数据类型可以为 CHAR、VARCHAR 或者 TEXT
例:
create table lcdb3(id int(4),name char(10),genter char(2), age int(2),address char(20
),fulltext index suoyin_index(address));
desc lcdb3;
SELECT * FROM 表名 WHERE MATCH(列名) AGAINST('查询内容');
例:
select * from team where match(name) against('lichen');
or
select * from member where name='liyong';
show index from 表名;
show index from 表名\G; 竖向显示表索引信息
show keys from 表名;
show keys from 表名\G;
Table | 表的名称 |
---|---|
Non_unique | 如果索引内容唯一,则为 0;如果可以不唯一,则为 1。 |
Key_name | 索引的名称。 |
Seq_in_index | 索引中的列序号,从 1 开始。 limit 2,3 |
Column_name | 列名称。 |
Collation | 列以什么方式存储在索引中。在 MySQL 中,有值‘A’(升序)或 NULL(无分类)。 |
Cardinality | 索引中唯一值数目的估计值。 |
Sub_part | 如果列只是被部分地编入索引,则为被编入索引的字符的数目(zhangsan)。如果整列被编入索引,则为 NULL。 |
Packed | 指示关键字如何被压缩。如果没有被压缩,则为 NULL。 |
Null | 如果列含有 NULL,则含有 YES。如果没有,则该列含有 NO。 |
Index_type | 用过的索引方法(BTREE, FULLTEXT, HASH, RTREE) |
Comment | 备注 |
DROP INDEX 索引名 ON 表名;
例:
drop index suoyin_index on lcdb3;
desc lcdb3;
ALTER TABLE 表名 DROP INDEX 索引名;
例:
alter table lcdb3 drop index suoyin_index;
ALTER TABLE 表名 DROP PRIMARY KEY;
例:
alter table lcdb1 drop primary key;
锁机制是为了避免,在数据库有并发事务的时候,可能会产生数据的不一致而诞生的的一个机制。
锁从类别上分为:
MySQL有三种锁的级别:页级、表级、行级。
如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。
产生死锁的四个必要条件
死锁4大要素:互斥,持有并请求,不可剥夺,持续等待
这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。
解决方法
1、撤消陷于死锁的全部进程;
2、逐个撤消陷于死锁的进程,直到死锁不存在;
3、从陷于死锁的进程中逐个强迫放弃所占用的资源,直至死锁消失。
4、从另外一些进程那里强行剥夺足够数量的资源分配给死锁进程,以解除死锁状态
分为两种情景:
本文主要讲了索引的分类以及如何创建。
索引分为:
创建索引:
PS:主键索引——》直接创建主键即可