MySQL面试整理
索引的目的在于提高查询效率,以及添加约束;
常用的索引有:
普通索引,唯一索引,联合索引,全文索引,空间索引...
唯一索引 有两个分类 分别是:主键索引和唯一索引
联合索引 有三个分类 分别是:联合普通索引、联合主键索引、联合唯一索引
索引类型:
hash:查询单条快,范围查询慢
b+树:层级越多,数据量指数级增长
存储引擎:
InnoDB:支持事务,支持行级别锁定,支持 B+树 、支持全文(Full-text)索引、不支持hash
MyISAM:不支持事务,支持表级别锁定,支持 B-tree、Full-text 等索引,不支持 Hash 索引;
Memory <卖么瑞>:不支持事务,支持表级别锁定,支持 B-tree、Hash 等索引,不支持 Full-text 索引;
NDB:支持事务,支持行级别锁定,支持 Hash 索引,不支持 B-tree、Full-text 等索引;
Archive <噢克莱夫>:不支持事务,支持表级别锁定,不支持 B-tree、Hash、Full-text 等索引;
未命中索引:
模糊查询:%在查询条件前面
使用函数:REVERSE(email);
or
类型不一致:
!=、>、<
order by:如果对非主键列排序,则结果列也需要索引,如果对主键排序 则结果列可没有索引---
count:count(*)、count(1)、count(列名) 资料上说尽量不使用count(*),但实测感觉区别不大
在创建表示 列类型是(text)时 必须指定长度,否则无法命中索引
组合索引时需要遵循(最左前缀原则);
覆盖索引:
select * from table_name where id = 123;
已知该表中的id字段已添加了索引,所以如上sql命中了索引,但是查询结果是*,如果想要查询效率更快 则需要覆盖索引:
select id from table_name where id = 123;