加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

口试官出的MySQL索引题目,这篇文章全给你办理!

发布时间:2019-10-12 09:06:58 所属栏目:编程 来源:欧阳思海
导读:0 媒介 这篇文章不会讲授索引的基本常识,首要是关于MySQL数据库的B+树索引的相干道理,内里的一些常识都参考了MySQL技能黑幕这本书,也算对付这些常识的总结。对付B树和B+树相干的常识,可以参考我的这篇博客:口试官问你B树和B+树,就把这篇文章丢给他 1

插入几条测试数据

  1. insert into t_index values('a','b','c','d'),  
  2. ('a2','b2','c2','d2'),  
  3. ('a3','b3','c3','d3'),  
  4. ('a4','b4','c4','d4'),  
  5. ('a5','b5','c5','d5'),  
  6. ('a6','b6','c6','d6'); 

到这一步,我们已经根基筹备好了必要的数据,我们可以举办更深一步的连系索引的切磋。

我们什么时辰必要建设连系索引呢

索引成立的首要目标就是为了进步查询的服从,那么连系索引的目标也是相同的,连系索引的目标就是为了进步存在多个查询前提的环境下的服从,就如上面成立的表一样,有多个字段,当我们必要操作多个字段举办查询的时辰,我们就必要操作到连系索引了。

什么时辰连系索引才会施展浸染呢

偶然辰,我们会用连系索引,可是,我们并不清晰其道理,不知道什么时辰连系索引会起到浸染,什么时辰又是会失效的?

带着这个题目,我们相识一下连系索引的最左匹配原则。

最左匹配原则:这个原则的意思就是建设组合索引,以最左边的为准,只要查询前提中带有最左边的列,那么查询就会行使到索引。

下面,我们用几个例子来看看这个原则。

  1. EXPLAIN SELECT * FROM t_index WHERE a = 'a' G; 

口试官出的MySQL索引题目,这篇文章全给你办理!

我们看看这条语句的功效,起首,我们看到行使了索引,由于查询前提中带有最左边的列a,那么操作了几个索引呢?这个我们必要看key_len这个字段,我们知道utf8编码的一个字符3个字节,而我们行使的数据范例是char(2),占两个字节,索引就是2*3便是6个字节,以是只有一个索引起到了浸染。

  1. EXPLAIN SELECT * FROM t_index WHERE b = 'b2' G; 

口试官出的MySQL索引题目,这篇文章全给你办理!

这个语句我们可以看出,这个没有行使索引,由于possible_keys为空,并且,从查询的行数rows可以看出为6(我们测试数据总共6条),声名举办了通盘扫描的,声名这种环境是不切合最左匹配原则,以是不会行使索引查询。

  1. EXPLAIN SELECT * FROM t_index WHERE a = 'a2' AND b = 'b2' ORDER BY d G; 

口试官出的MySQL索引题目,这篇文章全给你办理!

这种环境又有点纷歧样了,我们行使了一个排序,可以看出行使了索引,通过key_len为12可以获得行使了2个索引a、b,其它在Extra选项中可以看到行使了Using filesort,也就是文件排序,这里行使文件排序的缘故起因是这样的:上面的查询行使了a、b索引,可是当我们用d字段来排序时,(a,d)可能(b,d)这两个索引是没有排序的,连系索引的行使有一个甜头,就是索引的下一个字段是会自动排序的,在这里的这种环境来说,c字段就是排序的,可是d是不会,假如我们用c来排序就会获得纷歧样的功效。

  1. EXPLAIN SELECT * FROM t_index WHERE a = 'a2' AND b = 'b2' ORDER BY c G; 

口试官出的MySQL索引题目,这篇文章全给你办理!

是不是可以看到,当我们用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首要的优化计策。以是,在真正的现实应用中,包围索引是首要的晋升机能的优化本领之一。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读