索引(一)

今天电话面试招银网络,被问到一个索引的优缺点问题,答得不是特别好,问到一个系统开销的问题,大家都知道维护索引需要系统开销,具体是什么开销。特此收集资料进行总结,权当学习笔记。

一,索引的实现原理

常见的索引有B+Tree 索引,哈希索引,索引是按列创建的,可以理解为将字段按照一定的方式重新排列,就像书签一样,通过索引快速定位到表数据。

二,索引的优点

1,普通查询表的数据时,需要全局逐行扫描表的数据,如果使用B+索引,在B+树中使用二分查找的方式定位字段,执行效率较快,如果使用哈希索引,甚至可以在O(1)的时间复杂度内找到对应的字段。

2,在B+树结构中,根据计算机存储的热点原理,B+tree的叶子节点存储的数据存储在磁盘的同一页中,减少了磁盘寻道时间。

3,唯一性索引保证了每一行数据的唯一性。

4,加速表连接和分组。

三,索引的缺点

1,索引并不是全部都适用,当数据库的行数比较少的时候,不建议适用索引,适用全局扫描反而会更快。

2,创建和维护索引需要额外的存储空间和系统开销,所谓系统开销,就是说数据库会时刻进行数据的增删改查,以B+树为例,如果频繁的插入删除索引字段,索引就会出现很多碎块,那么索引的形态也就需要不断改变,维护索引的形态就是系统开销。可以使用DBCC DBREINDEX语句重建表的一个或者多个索引,具体使用说明参考其他博文。

3,使用聚簇索引时尤其耗费物理空间。关于什么是聚簇索引,下节研究一下索引的分类。

四,索引的使用场景

1,在经常需要搜索且不经常变更的列上创建索引

2,在作为主键的列上创建索引,实际上,在InnoDB引擎中,如果不显式指定索引列,InnoDB 会隐式创建并维护一个自增字段作为隐式索引。

3,在经常需要连接的列上创建索引,比如外键,可以加快连接的速度,这是因为多表操作在执行前,查询优化器会根据连接条件,列出几组连接方案并从中选择系统开销最小的最佳方案,这个时候就会充分考虑带有索引的表和行数多的表。

4,为经常使用WHERE/Group By字句的查询判断字段建立索引。

五,索引的使用注意事项

1,索引使用遵循最左匹配原则,MySQL会一直从左向右匹配,直到遇到范围查询或者like为止。比如a=1 and b=2 and c>3 and d=4,如果建立(a,b,c,d) 的组合索引,d 是用不到索引的,如果建立(a,b,d,c)则可以用到,在 =/in 子句中abd的顺序可以调整的,即b=1 and a=2 and d=3 与 a=1 and b=2 and d=4 是等价的,因为MySQL的查询优化器会自动优化成索引可以识别的形式。

2,在建立多列索引时,特别留意索引的顺序,有个经验法则就是将选择性最高的列放在索引最前面。

column1 的选择性定义:count(distinct colunm1) /count(*)

3,索引列不能参与计算或者变换,比如from_unixtime(happend_time) 不能触发happend_time 这个索引,原因是B+树中存储的是数据表中的字段值。

4,like 模糊查询或者 OR字句不能触发索引,但是 321% 这种右模糊查询可以触发索引。

5,索引字段不应该选择过大的字段,比如 text,bigInt,image这些类型。因为这会导致索引很庞大,存储空间太大。

暂时先写这么多,后续再总结一些索引的类型。

顺便分享一下今天招银网络的面经:

1,项目经验,针对项目问了几个问题,项目太水,没啥好问的。

2,了解哪些聚类算法?K-means 聚类算法的原理

3,数据库,索引的优缺点,事务的四个特性

4,Linux ,如何删除一个正在运行的进程

5,Java,内存模型和垃圾回收机制。

6,没了,就20分钟,听说招银的电面都这样随便问问。

听说这家公司还不错,期待一下能不能进入下一轮了,,

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值