mysql索引
mysql索引
mysql索引
mysql中为什么要使用索引?有什么缺点吗? 索引其实就是一个数据结构,其功能就像是一个目录,能够快速的定位数据记录。 缺点: 索引也占用相应的空间,在更新或者新增数据的时候,索引也需要进行更新。
索引具体采用哪些数据结构呢? B+树、B树、哈希表
介绍一下? B+树是一颗多叉树,叶子节点存放的是数据记录,非叶子节点存放的是索引。 B树也是一颗多叉树,每个节点存放索引和数据记录。 哈希表底层使用的是哈希表,将索引作为key,将数据记录作为value。
比较一下? B+树和哈希索引:B+树能够满足范围查询、联合索引、覆盖索引,查询复杂度是log(n)。而Hash索引,仅仅适用于查询单值,查询效率为O(1),而写不能够范围查询,不能够联合索引和覆盖索引,另外还需要考虑哈希冲突。 B+树和B树:B树无法进行范围查询,由于不是在叶子节点存放数据记录,所以IO次数相对于B+树相对较少。
什么是回表? 对于普通索引,B+树的叶子节点存放的是主键索引,我们需要根据叶子节点的主键索引再进行检索。这个过程称为回表。
什么是普通索引(非聚簇索引),什么是聚簇索引? 根据叶子节点是数据记录还是主键索引来区分,数据记录是聚簇索引,主键索引是非聚簇索引
非聚簇索引一定需要回表查询吗? 其实不一定,有时叶子节点存放的索引其实就是我们需要的结果。
什么是覆盖索引? 这里需要说的就是覆盖索引,就是我们需要检索的结果其实就是我们的索引。比如我们对于select id name from user where name=“123”,这里就不需要回表,另外也可以创建,联合索引。其应用场景,比如count(name) name设置为索引 就可以优化全局count计数。
联合索引是什么?多个字段的顺序如何选择? 联合索引就是多个列组成的索引。索引的顺序根据最左前缀原则来选择, 将频繁查询的放在最左端。
什么是最左前缀原则?什么条件下失效? 多个按照顺序排序,最左边的最先检索。原理就是:B+树的节点存放的就是多个列组成的联合索引,在多叉分支的时候,会先按照最左边的大小进行排序。在<> between like 的条件下会失效。
如何检查索引起了作用了呢? explain查看sql语句的执行计划,根据执行计划来查询key字段的索引名称,然后查看extra是否是using index。另外查询优化器会根据最小成本原则(IO成本和CPU计算成本)进行优化,选出最小成本的执行计划。
什么情况下索引会失效? 联合索引的最左原则、对于非主键索引使用!= < >、where 子句中少用or 会导致放弃使用索引而进行全表扫描、like模糊查询以%开头,索引失效、
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~