面试中经常会被问到mysql索引的问题,所以简单记了几个点
什么是索引
索引是对数据库表中一列或者多列的值进行排序的一种结构;
就类似于书的目录,单独弄几页出来存放目录,通过目录我们可以快速找到指定页。
索引的优势
1、快速访问:通过索引我们可以快速得定位访问到数据库表中的特定数据,可以加
快检索表的速度,提高性能。
2、利用唯一性约束,可以保证数据的某个字段的值及其所在数据行在全表中是唯一
的;
3、作为多表关联查询时的条件,也可以加速表与表之间数据的快速匹配连接;
4、在分组和排序字句进行数据检索,可以减少查询时间中分组和排序时所消耗的时间
(数据库的记录会重新排序)。
索引的缺点
1、增加I/O成本,在创建、维护索引的时候,需要耗费时间,这个时间的成本会随
着数据的增加而增加;
2、占用磁盘,索引就像书本的目录,需要单独开几页来存放,数据越多,索引数据
就越大,自然就要占用更多的硬盘空间;
3、降低效率;这里指的是增、删、改的效率,增删改的时候需要额外去维护索引的
结构,这样自然就增加了数据维护时的时间;所以需要合理建立索引。
索引的创建
索引应该如何创建?一般需要对哪些字段创建索引?
1、主键字段;在主键字段上创建索引,强制该字段的唯一性和组织表中数据的排列
结构;
2、外键字段;经常用在连接(JOIN)的列上,这些列主要是一外键,可以加快连接
的速度;
3、条件范围索引;在经常需要根据范围(> < >= <= IN BETWEEN)进行搜索
的字段上添加索引,因为索引已经排序,其指定的范围是连续的;
4、排序字段;在经常需要进行排序的字段上添加索引,因为索引已经排序,这样的
查询可以利用索引的排序,加快排序查询的时间;
5、条件字段;在经常会被用来进行where查询的字段上添加索引,加快判断的速度;
6、组合索引;选中多个字段添加索引,在查询时如果查询条件中没有包含最左索引
,那么将不会命中索引;
索引失效
某些情况下即使我们查询条件中带上了添加了索引的字段,但是查询的时候也不会
用到索引;
1、like语句以%开头,比如 select * from table where name like '%A';以%
开头代表需要查询的字段的前面是模糊的,必须要一个个去找;
2、查询条件中有or;及时or条件中有条件是添加了索引的,也不会使用索引去查询;
除非是or条件的每个条件都创建了索引;
3、如果类型是字符串类型,那么查询是一定要把数据用引号包起来,否则也不会使
用索引;
4、如果mysql判断全表扫描比索引查询要快,那么也不会使用索引;
5、对于复合索引。如果查询条件中没有用到复合索引中最左侧的索引,那么会索引
失效;如果查询条件有跳过索引字段,比如复合索引中有字段(A,B,C)三个字段,查
询时只用到了字段A和字段C,那么也会导致索引失效;这是最佳左索引原则;
6、is null,is not null也会导致索引失效,因为索引是不会存放null值的;
各位Coder如果有自己面试遇到的,里面没有的,可以在下面评论,博主会补充进来的;