MySQL 索引

MySQL 索引 事务 存储引擎

索引:索引是一个排序的列表,列表当中存储的是索引的值和包含这个值的数据所在行的物理地址。

MySQL 索引_第1张图片

作用:为了快速查找。

索引的作用:

1,利用索引数据库可以快速定位,大大加快查询速度,主要作用。

2,表的数据很多,查询需要关联多个表,这个时候索引也可以提高查询速度。

3,加快表与表之间的连接速度

4,使用分组和培训时,可以大大减少时间

5,提高数据库恢复时间的速度

索引创建的原则:

有索引,数据库会先进行索引查询,然后定位数据,索引使用不当,反而会增加数据库的负担。

主键,外键必须亚欧索引(创建好了主键外键自动就是索引,不需要额外声明)

一个表超过了300行记录,必须要有索引,否则数据库会遍历表的所有数据。

互相之间有关联的表,在关联字段上应该设置索引。

唯一性太差的字段,不适合创建索引。

更新太频繁的字段不适合做索引。

经常被where条件匹配的字段,尤其是数据比较多的,应该创建索引。

在经常进行group by (分组) order by(排序)的字段要建立索引。

索引要建立在小字段上,长文本的字段不适合建立索引。

查看表的索引

show index from test;

常用类型:

B-树索引 BTREE

树形结构的类型,也是大部分数据库的默认使用类型。

根结点:数的最顶端的分支节点

分支节点:指向索引里其他的分支节点,也可以是指向叶子节点

MySQL 索引_第2张图片

哈希索引:散列索引 把任意长度的输入,通过散列算法换成固定长度的输出。散列值---分别对应数据里的行和列。

mysql的默认引擎:INNODB 默认的索引类型就是Btree。

MEMORY引擎可以支持HASH,也是他的默认索引。

先算散列值,然后在对应,速度比较慢,比btree慢

hash的索引匹配:=in ()

创建hash索引的方式

MySQL 索引_第3张图片

如何创建索引:(默认就是Btree索引)

create index name_index on test (name);

MySQL 索引_第4张图片

创建表的时候需要考虑的因素:

1,关联程度 3张表,选好关联字段

2,每个字段的长度,也要考虑。

3,设计合理的索引列。

4,表数据,要控制在合理的范围之内。

4,表数据,要控制在合理的范围之内。可以在牺牲一定性能的条件下,满足需求。5秒以上就要考虑优化了。10秒以上一般是出现问题了。(缓存失效,缓存击穿,缓存雪崩)

索引的类型:

BTREE mysql orcale 默认都是树形结构的索引

HASH:散列值,只能匹配= in() hash是不能排序的。排序时,索引是失效的。

创建索引:

能在键表的时候创建好的条件,尽量把条件约束好,不要创建完之后在添加

show index from member; 查看表中的索引

在表中直接创建索引

MySQL 索引_第5张图片

index name_index (name)

以修改的方式添加索引

alter table member add index cradid_index (card_id);

以上为普通索引

唯一索引:unique 与普通索引类似,唯一索引的每个值都是唯一,唯一索引允许空值。添加唯一键才会创建唯一索引。最好不要为空unique not null

在表中直接创建索引:

MySQL 索引_第6张图片

unique cardid_index (card_id)

创建唯一索引:create unique index phone_index on member (phone);

修改唯一索引:alter table member add unique address_index (address);

主键索引:创建表是指定的主键就是索引。添加主键自动就是主键索引。

主键:值唯一 一个表只能有一个主键 不允许有空值 创建主键,自动主键索引。

全文索引:适合在进行模糊查询的时候使用,可以在文章中检索文本信息。

text

MySQL 索引_第7张图片

创建全文索引

直接在表中创建:fulltext notes_ubdex (notes)

在外创建:CREATE fulltext index notes_index on member2 (notes);

修改创建:alter table test3 add fulltext notes_index (notes);

删除索引:drop indexnotes_index on test3;

索引语句:select * from test3 where notes like '%bb';

查询索引是否生效:explain

explain select * from test3 where notes like '%bb';

联合索引:指定一个索引名,一个索引名对应多个列名。也叫组合索引

创建联合索引

MySQL 索引_第8张图片

create index index_union on member3 (card_id,phone);

MySQL 索引_第9张图片

explain select * from member3 where card_id =14 and phone =333;

联合索引,查询时必须按照顺序来进行查询

索引失效的几个场景

CREATE table member4 (

id int(4) PRIMARY KEY,

name VARCHAR(10),

cardid int(18) not null,

phone int(11) not null,

UNIQUE index name_cardid_phone (name,cardid ,phone)

);

show index from member4;

explain select * from member4 where name='cc2' and id=2;

mysql机制:默认会找最短索引列。最优索引选择。

联合索引,从左到右开始,不能跳过索引,否则索引会失效。

范围查询,有可能右侧的索引会失效。

CREATE table member5 (

id int(4) PRIMARY KEY,

name VARCHAR(10),

age int(18) not null,

address VARCHAR(11) not null,

index index_age (age),

index index_address (address)

);

show index from member5;

explain select * from member5 where address = '111';

如果索引是字符串,但是不加引号,索引也会失效

explain select * from member5 where id=18 or address = '111';

使用or语句索引一定失效,使用or作为条件,mysql无法同时使用多个索引。

is NULL

is not NULL

有时候索引会失效 where is null 数据的绝大多数都是空值,索引失效

whereis not NULL 数据多数为不null,索引失效

总结:

索引:普通索引 主键索引 唯一索引 全文索引 联合索引

场景索引时,主要索引失效的情况

explain 加在查询语句前面。可以查看索引的使用情况。

面试题:

现在一张表的查询速度是7.62s;

你该如何索引?

首先查缓存 看是不是请求到了后端数据库。(也就是缓存击穿了):修复缓存

再看索引,请求的列值不是默认的索引,添加一下即可

怎么看:explain

案例:比如为某商场做-一个会员卡的系统。这个系统有一个会员表,有下列字段: .

会员编号INT 主键索引

领姓名VARCHAR(10) 普通索引

会员身份证号码INT(18) 唯一索引

会员电话INT(11) 联合索引

员住址VARCHAR(50) 联合索引

会员备注信息TEXT 全文索引

1,先创建表,VIP_member

2,根据你的选择选择,来给这张表索引。

3,每个列都要创建索引,然后执行结果发图。

你可能感兴趣的:(mysql,数据库)