面试官出的MySQL索引问题,这篇文章全给你解决!
插入几条测试数据
到这一步,我们已经基本准备好了需要的数据,我们可以进行更深一步的联合索引的探讨。 我们什么时候需要创建联合索引呢 索引建立的主要目的就是为了提高查询的效率,那么联合索引的目的也是类似的,联合索引的目的就是为了提高存在多个查询条件的情况下的效率,就如上面建立的表一样,有多个字段,当我们需要利用多个字段进行查询的时候,我们就需要利用到联合索引了。 什么时候联合索引才会发挥作用呢 有时候,我们会用联合索引,但是,我们并不清楚其原理,不知道什么时候联合索引会起到作用,什么时候又是会失效的? 带着这个问题,我们了解一下联合索引的最左匹配原则。 最左匹配原则:这个原则的意思就是创建组合索引,以最左边的为准,只要查询条件中带有最左边的列,那么查询就会使用到索引。 下面,我们用几个例子来看看这个原则。
我们看看这条语句的结果,首先,我们看到使用了索引,因为查询条件中带有最左边的列a,那么利用了几个索引呢?这个我们需要看key_len这个字段,我们知道utf8编码的一个字符3个字节,而我们使用的数据类型是char(2),占两个字节,索引就是2*3等于6个字节,所以只有一个索引起到了作用。
这个语句我们可以看出,这个没有使用索引,因为possible_keys为空,而且,从查询的行数rows可以看出为6(我们测试数据总共6条),说明进行了全盘扫描的,说明这种情况是不符合最左匹配原则,所以不会使用索引查询。
这种情况又有点不一样了,我们使用了一个排序,可以看出使用了索引,通过key_len为12可以得到使用了2个索引a、b,另外在Extra选项中可以看到使用了Using filesort,也就是文件排序,这里使用文件排序的原因是这样的:上面的查询使用了a、b索引,但是当我们用d字段来排序时,(a,d)或者(b,d)这两个索引是没有排序的,联合索引的使用有一个好处,就是索引的下一个字段是会自动排序的,在这里的这种情况来说,c字段就是排序的,但是d是不会,如果我们用c来排序就会得到不一样的结果。
是不是可以看到,当我们用c进行排序的时候,因为使用了a、b索引,所以c就自动排序了,所以也就不用filesort了。 讲到这里,我相信通过上面的几个例子,对于联合索引的相关知识已经非常的透彻清晰了,最后,我们再来聊几个常见的问题。 Q1:为什么不对表中的每一个列创建一个索引呢 第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。 第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。 第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。 Q2:为什么需要使用联合索引 减少开销。建一个联合索引(col1,col2,col3),实际相当于建了(col1),(col1,col2),(col1,col2,col3)三个索引。每多一个索引,都会增加写操作的开销和磁盘空间的开销。对于大量数据的表,使用联合索引会大大的减少开销! 覆盖索引。对联合索引(col1,col2,col3),如果有如下的sql: select col1,col2,col3 from test where col1=1 and col2=2。那么MySQL可以直接通过遍历索引取得数据,而无需回表,这减少了很多的随机io操作。减少io操作,特别的随机io其实是dba主要的优化策略。所以,在真正的实际应用中,覆盖索引是主要的提升性能的优化手段之一。 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |