zoukankan      html  css  js  c++  java
  • mysql索引和sql优化

    索引类型

    FULLTEXT:全文索引,目前只有MyISAM引擎支持
    HASH:单个和in查询效率高,类似kv,但是范围和排序组合效率低
    BTREE:最常用的索引类型,即B+树

    索引种类

    普通索引:仅加速查询
    唯一索引:加速查询 + 列值唯一(可以有null)
    主键索引:加速查询 + 列值唯一(不可以有null)+ 表中只有一个
    组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并
    全文索引:对文本的内容进行分词,进行搜索
    索引合并,使用多个单列索引组合搜索
    覆盖索引,select的数据列只用从索引中就能够取得,不必读取数据行,换句话说查询列要被所建的索引覆盖

    MyISAM和Innodb

    两个引擎都默认有一个主键索引,几遍不设置主键也会默认指定一个;
    主要都是使用B+数结构,下面只讨论B+树的情况;
    MyISAM的主键索引,所有节点只包含索引,不行数据,各个叶子之间指针相连且有顺序,拿到索引后,需要回表查询;其他辅助索引也是类似;
    Innodb的主键索引,只有叶子节点包含数据,各个叶子之间指针相连且有顺序;辅助节点只保存主键的引用,需要根据主键回表查询;

    实践

    • like语句的条件尽量采用右边模糊匹配,如:select * from user where username like '王二%',依据左侧原则,这条语句可以走索引
    • 如果对name,age添加了索引,则查询的时候,不要用select *,用select name,age from,因为B+树的叶子节点包含数据,所以从索引上就能取到数据
    • 查看执行计划,看语句是否走了索引:explain + 查询SQL
    • 最左原则:假设设置了索引a、b、c,则条件为ab、ac、abc、ba、ca、bac会走索引,只要出现了a就可以,mysql引擎对条件的顺序有优化;而条件为b,bc,cb是不会走索引的;
      ......
  • 相关阅读:
    当···时发生了什么?
    数据存储-3、数据库分库分表思路
    数据存储-2、反模式设计
    数据存储-1、MySQL 索引使用的注意事项
    锁机制-4、synchronized 与 lock 的区别
    锁机制-3、synchronize 实现原理
    锁机制-1、乐观锁与悲观锁以及乐观锁的一种实现方式
    线程-11、线程的生命周期
    线程-10、线程池的几种方式
    线程-9、线程池的实现原理
  • 原文地址:https://www.cnblogs.com/yinchh/p/12398762.html
Copyright © 2011-2022 走看看