从措施员的角度深入领略MySQL
假设存在复合索引(name,age,sex),我们在举办select的时辰,并没有凭证这个次序举办,而是sex = 'man' and name = 'zfz' and age = 27,是否会行使索引呢?数据库是很智慧的,在SQL优化的时辰,会自动辅佐我们调解!可是假如缺失了复合索引的第一列,数据库也将无能为力呢。 对付最左匹配,MySQL会一向向右匹配直到碰着范畴查询就遏制匹配。什么意思?好比复合索引(name,age,sex),对付name = 'zhangfengzhe' and age > 26 and sex = 'man',现实上只操作到了复合索引的name列。 想操作索引,就得“干净” 什么叫“干净”?就是不要让索引参加计较!好比在索引上应用函数,很也许导致索引失效。为什么呢? 着实不消想,B+Tree上存储的是数据,要较量的话,必要把全部的数据都应用上函数,显然本钱太大。 想成立索引,看看区分度 索引固然物美价廉,可是也别糊弄。count(distinct col) / count(*)可以算一下col的区分度,显然对付主键而言,就是1。区分度太低的话,可以思量下,是否尚有须要成立索引呢? Hash索引 这里并不是要深入说明Hash索引,而是要声名一下Hash的头脑真是无处不在! 在MySQL的Memory存储引擎中,存在hash函数,给一个key,通过hash函数举办计较获得地点,以是凡是环境下,hash索引查找,会很是快,O(1)的速率。可是也存在hash斗嘴,和HashMap一样,通过单链表的情势办理。 思索下,hash索引是否支持范畴查询呢? 显然是不支持的,它只能给一个KEY去查找。就犹如HashMap一样,查找key包括"zhangfengzhe"的,会很快么? SQL优化神器:explain SQL优化的场景许多,网上的能力大概多,完全记不住! 要想彻底办理这个题目,我想只有把索引背后的数据布局和道理做恰当的领略,碰着誊写SQL可能SQL慢查询的时辰,我们有基本去说明,再操作好explain器材去验证,就应该题目不大呢。 explain查询的功效,可以汇报你哪些索引正在被行使,表是怎样被扫描的等等。这里我将演示个Demo。 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |