MySQL 索引 事务 存储引擎
索引:索引是一个排序的列表,列表当中存储的是索引的值和包含这个值的数据所在行的物理地址。
作用:为了快速查找。
索引的作用:
1,利用索引数据库可以快速定位,大大加快查询速度,主要作用。
2,表的数据很多,查询需要关联多个表,这个时候索引也可以提高查询速度。
3,加快表与表之间的连接速度
4,使用分组和培训时,可以大大减少时间
5,提高数据库恢复时间的速度
索引创建的原则:
有索引,数据库会先进行索引查询,然后定位数据,索引使用不当,反而会增加数据库的负担。
主键,外键必须亚欧索引(创建好了主键外键自动就是索引,不需要额外声明)
一个表超过了300行记录,必须要有索引,否则数据库会遍历表的所有数据。
互相之间有关联的表,在关联字段上应该设置索引。
唯一性太差的字段,不适合创建索引。
更新太频繁的字段不适合做索引。
经常被where条件匹配的字段,尤其是数据比较多的,应该创建索引。
在经常进行group by (分组) order by(排序)的字段要建立索引。
索引要建立在小字段上,长文本的字段不适合建立索引。
查看表的索引
show index from test;
常用类型:
B-树索引 BTREE
树形结构的类型,也是大部分数据库的默认使用类型。
根结点:数的最顶端的分支节点
分支节点:指向索引里其他的分支节点,也可以是指向叶子节点
哈希索引:散列索引 把任意长度的输入,通过散列算法换成固定长度的输出。散列值---分别对应数据里的行和列。
mysql的默认引擎:INNODB 默认的索引类型就是Btree。
MEMORY引擎可以支持HASH,也是他的默认索引。
先算散列值,然后在对应,速度比较慢,比btree慢
hash的索引匹配:=in ()
创建hash索引的方式
如何创建索引:(默认就是Btree索引)
create index name_index on test (name);
创建表的时候需要考虑的因素:
1,关联程度 3张表,选好关联字段
2,每个字段的长度,也要考虑。
3,设计合理的索引列。
4,表数据,要控制在合理的范围之内。
4,表数据,要控制在合理的范围之内。可以在牺牲一定性能的条件下,满足需求。5秒以上就要考虑优化了。10秒以上一般是出现问题了。(缓存失效,缓存击穿,缓存雪崩)
索引的类型:
BTREE mysql orcale 默认都是树形结构的索引
HASH:散列值,只能匹配= in() hash是不能排序的。排序时,索引是失效的。
创建索引:
能在键表的时候创建好的条件,尽量把条件约束好,不要创建完之后在添加
show index from member; 查看表中的索引
在表中直接创建索引
index name_index (name)
以修改的方式添加索引
alter table member add index cradid_index (card_id);
以上为普通索引
唯一索引:unique 与普通索引类似,唯一索引的每个值都是唯一,唯一索引允许空值。添加唯一键才会创建唯一索引。最好不要为空unique not null
在表中直接创建索引:
unique cardid_index (card_id)
创建唯一索引:create unique index phone_index on member (phone);
修改唯一索引:alter table member add unique address_index (address);
主键索引:创建表是指定的主键就是索引。添加主键自动就是主键索引。
主键:值唯一 一个表只能有一个主键 不允许有空值 创建主键,自动主键索引。
全文索引:适合在进行模糊查询的时候使用,可以在文章中检索文本信息。
text
创建全文索引
直接在表中创建: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';
联合索引:指定一个索引名,一个索引名对应多个列名。也叫组合索引
创建联合索引
create index index_union on member3 (card_id,phone);
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,每个列都要创建索引,然后执行结果发图。