zoukankan      html  css  js  c++  java
  • Mysql索引原理

    1.树

    根结点 : 2   root 

    父节点 : 2是3,4,5的父节点

    分支: 3,4,6,7  branch

    叶子节点:8,9,10是叶子节点 leaf

    树的深度/树的高度:高度为3

    1.二叉树

    2.平衡树

    能够让查找每一个数据经历的I/O次数尽量平衡

    balance tree:简称b树

    平衡树不一定是二叉树

    为什么不用二叉树 :因为二叉树存储的数据太少了

    3.b+树

    1.能够让查找每一个数据经历的I/O次数尽量平衡;

    2.分支节点不存储数据—让树的高度尽量矮,让查找一个数据的效率尽量的稳定;

    3.在所有叶子节点之间加入了双向的地址链接—查找范围非常快;

     2.聚集索引&非聚集索引

    1.两种索引的差别

      聚集索引,聚簇索引:全表数据都存储在叶子节点上

      innodb必有且仅有一个:主键

      innodb存储引擎中的主键默认就会创建一个聚集索引,如果没有创建主键,innodb自动隐藏式的给数据添加主键;

      将主键组织到一棵B+树中,而行数据就储存在叶子节点上,若使用"where id = 14"这样的条件查找主键,则按照B+树的检索算法即可查找到对应的叶节点,之后获得行数据。若对Name列进行条件搜索,则需要两个步骤:第一步在辅助索引B+树中检索Name,到达其叶子节点获取对应的主键。第二步使用主键在主索引B+树种再执行一次B+树检索操作,最终到达叶子节点即可获取整行数据。

      非聚集(簇)索引,辅助索引:叶子节点不存放具体的整行数据,而是存储的这一行的主键的值:

      MyISM使用的是非聚簇索引,非聚簇索引的两棵B+树看上去没什么不同,节点的结构完全一致只是存储的内容不同而已,主键索引B+树的节点存储了主键,辅助键索引B+树存储了辅助键。表数据存储在独立的地方,这两颗B+树的叶子节点都使用一个地址指向真正的表数据,对于表数据来说,这两个键没有任何差别。由于索引树是独立的,通过辅助键检索无需访问主键的索引树。

    2.索引的创建与删除

      创建主键: primary key 聚集索引 + 非空 +唯一

      创建唯一约束: unique 辅助索引 + 唯一

      添加一个普通索引

      创建索引: create index 索引名 on 表(字段)

            create index 索引名 on 表(字段1,字段2)

      删除索引: drop index 索引名 on 表名字;

    3.正确的使用索引

      1.从库的角度

        a.搭建集群

        b.读写分离

         c.分库

      2.从表的角度

        a.合理安排表与表之间的关系:该拆的拆,该合的合

        b.把固定长度的字段放在前面

        c.尽量使用char而不是varchar

      3.从操作数据的角度

        a.尽量在where字段就约束数值到一个比较小的范围:分页 where a between value1 and value2

        b.尽量使用连表查询代替子查询

        c.删除数据和修改数据的时候条件尽量使用主键

      4.合理的创建和使用索引

        a.创建索引

          选择区分度比较大的列

          尽量选择短的字段创建索引

          不要创建不必要的索引,及时删除不用的索引

        b.使用索引

          ①查询的字段不是索引字段

          ②在条件中使用范围,结果的范围越大速度越慢,范围小的快

          ③like’a%’命中索引,like’%a’不命中索引

          ④条件列不能参与计算不能使用函数

          ⑤and/or

          and条件相连 有一列有索引都会命中

          or条件相连 所有列都有索引才能命中

          ⑥联合索引

          遵循最左前缀原则, 必须带着最左边的列做条件,且从出现范围开始索引失效

          ⑦条件中的数据类型和实际字段的类型必须一致

          ⑧select字段中应该包含order by中的字段

          select age from 表 order by age ; 快

          select name from 表 order by age ; 慢

  • 相关阅读:
    VS2008 环境中完美搭建 Qt 4.7.4 静态编译的调试与发布 Inchroy's Blog 博客频道 CSDN.NET
    编写可丢弃的代码
    c++ using namespace std; 海明威 博客园
    解决MySQL server has gone away
    nginx upstream 调度策略
    (2006, 'MySQL server has gone away') 错误解决 dba007的空间 51CTO技术博客
    Linux IO模型漫谈(2) 轩脉刃 博客园
    redis源码笔记 initServer 刘浩de技术博客 博客园
    MySQLdb批量插入数据
    词库的扩充百度百科的抓取你知道这些热词吗? rabbit9898 ITeye技术网站
  • 原文地址:https://www.cnblogs.com/sewen-H/p/13213245.html
Copyright © 2011-2022 走看看