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;