如下是结合网上及此前面试时遇到的一些关于mysql索引的面试题。
若对mysql索引不太了解可先翻阅相关文章mysql
索引相似书本的目录,查询书中的指定内容时,先在目录上查找,以后可快速定位到内容位置。在数据库中一般经过B树/B+树数据结构实现。sql
主键索引树中叶子节点存储的是整行数据,而非主键索引叶子节点上保存的是主键的值。使用非主键索引时,先从非主键索引获取到行对应主键ID,以后再根据id在主键索引树上搜索对应行数据,这个过程也被称为回表。数据库
通常使用innodb的自增整数类型做为主键:数组
为查询条件字段建立索引,以达到快速过滤指定条件数据的目的。数据结构
## order by
当使用order by将查询结果按某个字段排序时,可考虑为该字段建立索引。没有索引时,会先将查询结果放到内存中进行排序(若内存空间不足,会利用磁盘辅助排序),比较影响查询效率。
索引自己是有序的,能够直接按索引的顺序逐条回表取出数据便可。若是是分页查询,效果更好,这时候只须要取出某个范围的索引对应的数据,而不须要取出全部知足条件的数据排序后再截取返回分页数据。函数
使用join时,为被驱动表的关联字段建立索引,能够有效提升查询效率。好比select * from t1 straight_join t2 on (t1.a=t2.a) where t1.b = 'xxxx';
t2的字段a上有索引,查询过程会是先从表1中依次取出知足条件的行数据,以后用行数据中的a字段去t2上匹配后将两表字段拼接返回,此时能使用到t2.a的索引,避免了t2全表扫描。性能
若是select字段+where字段字段列数不太多且查询频繁时,能够考虑为select和where字段建立联合索引,避免查询时回表,提升查询效率。好比select a from t where b = ‘xx’
, 建立联合索引(b, a), 此时扫描索引树后,就已经获得须要查询的字段a了,不须要再回表。须要注意的是联合索引字段的顺序,这个语句没法使用到索引(a, b)。mysql索引
a = 1 and b = 2 and c > 3 and d = 4
,若是创建 (a,b,c,d) 顺序的索引,d 是用不到索引的。order by a,b,c,d
。上面查询条件中,a定值,b是有序的;b定值,c是有序的;c范围查询,剩下的d是无序的。因此d没法使用到该索引。a=1 or b = 2
,只有当a和b都有索引才能使用到索引。Mysql设计的使用场景比较普遍,须要对遍历查询、单条查询、数据更新都须要较好的性能支持。B+树的特性是只在叶子节点上存储数据。能够从数据读写方面与哈希表、有序数组、b树其余几种索引模型进行比较:学习
能够考虑先删掉表的索引,等删除数据后再重建索引。当咱们在进行数据修改时,须要同时修改索引,这些额外的索引维护成本较低数据修改的效率;同时,大量的数据删除会致使索引数据页产生大量的碎片空间,此时删除数据后重建索引可使索引树更“紧凑”,提升磁盘空间利用率。
数据页调整后,若是数据页过小层数会太深,数据页太大,加载到内存的时间和单个数据页查询时间会提升,须要达到平衡才行。
能够利用 explain 查看 sql 语句的执行计划,经过执行计划来分析索引使用状况。
喜欢本文的朋友,欢迎关注公众号「会玩 code」,专一大白话分享实用技术。
回复【mysql】获取免费测试数据库!!
回复【pdf】获取持续更新海量学习资料!!