美文网首页
Mysql面试总结

Mysql面试总结

作者: 百事可乐丶 | 来源:发表于2020-05-26 11:45 被阅读0次
    1.索引建立字段选择
      离散度高,字段使用率高,字段尽量精简
    
    1:为什么Mysql不多建立索引
      因为:每次DML都会对索引就行修改,B+树采用的分裂合并进行索引树的平衡,如果索引过多,每次DML的时候修改的索引多,会严重影响DML的效率.
    
    为什么选用 B+Tree 不用B-Tree
    1. B+Tree 是B-树的变种(PLUS版)多路绝对平衡查找树,它拥有B-树的优势。
    2. B+Tree 扫库、表能力更强。
    如果要从 B-Tree 中扫描表数据的话,基本要把整棵树都要扫描一遍,因为每个节点都存在数据区。B+Tree 就不需要扫描整棵树,只需要扫描叶子节点就可以了。
    3. B+Tree 的磁盘读写能力更强。
    B+Tree 的节点上是不保存数据的,那么它保存的关键字就更多,这样一次 IO 操作,加载的关键字就更多,所以它的磁盘读写能力更强。
    4. B+Tree 的排序能力更强。
    B+Tree 的叶子节点天然就是顺序存放的
    5. B+Tree 的查询效率更加稳定。
    比如我们从上图的 B-Tree 中查询一条 id 等于8的数据需要经过两次 IO 操作,查询一条 id 等于3的数据需要经过三次 IO 操作,而从上图的 B+Tree 中只有叶子节点才保存数据,所以查询任何数据都需要经过三次 IO 操作。 所以 B+Tree 的查询效率更加稳定
    
    
    联合索引最左匹配原则
    联合索引能够满足最左侧查询需求,例如 (a, b, c) 三列的联合索引,能够加速 a | (a, b) | (a, b, c) 三组查询需求,必须要有a检索条件b检索条件索引才生效,同理c必须有要a,b条件都在才能生效
    
    
    索引的注意事项
    1. 索引列不允许为空
    2. 索引列的数据长度能少则少
    3. 索引一定不是越多越好,越全越好,一定是建合适的
    4. 匹配列前缀可用到索引 like 9999%,like %9999%、like %9999 用不到索引
    5. where 条件中 not in 和 <> 操作无法使用索引
    6. 匹配范围值,order by 也可用到索引
    7. 多用指定列查询,只返回自己想到的数据列,少用 select *
    8. 联合索引中如果不是按照索引最左列开始查找,无法使用索引
    9. 联合索引中精确匹配最左前列并范围匹配另外一列可以用到索引
    10. 联合索引中如果查询中有某个列的范围查询,则其右边的所有列都无法使用索引
    

    分页优化

    SELECT * FROM t_good WHERE stock_number > 50
    LIMIT 400000,100;
    
    ##上述sql 可用主键ID(serialNumber)进行优化,在数据量比较大,且主键id是自增的情况下
    SELECT * FROM t_good WHERE  serialNumber >=( SELECT serialNumber FROM t_good WHERE stock_number > 50 LIMIT 400000, 1 ) and stock_number > 50
    LIMIT 100;
    

    in 和 exists以及 not in 和 not exists

    #在t_goods表明显大于t_user表
    #in 时大表驱小表   该用exists变成小表驱大表效率高很多
    select  * from t_user where `name`in (select gname from t_good);
    select * from t_user t where exists (select 1 from t_good t1 where t1.gname = t.name);
    
    #同理这种情况in效率要高很多
    select  * from t_good  where `gname`in (select name from t_user);
    select * from t_good t where exists (select 1 from t_user t1 where t.gname = t1.name);
    
    not exists 可以用上索引 而not in不能;
    
    
    not in (x)里面含有null会什么数据都查不出来,in()可以 
    

    相关文章

      网友评论

          本文标题:Mysql面试总结

          本文链接:https://www.haomeiwen.com/subject/aysmahtx.html