• 数据库-----索引 和网络调用


    ---恢复内容开始---

    一.什么是索引?

      在MySQL中也叫一种'键',是存储引擎用于快速查找记录的一种数据结构.

    b+ 树:一个高度可控的多路搜索树,目的是每次查询数据时,把磁盘的IO次数控制在一个很小的数量级.

      而IO的次数取决于输的高度,所以,磁盘块的空间一定的情况下 ,数据项里的数据占的空间越小,数据项越多,树的高度越低,这样是最好的.(大概高度也就3层吧,因为每次IO用时间大概是0.09毫秒左右,这里我用的7200/分的磁盘来说的,这样的话我们就把它每次查询数据的时间大概控制在了0.3秒以下,这个时间用户是感知不到的,这个速度就可以.)

      数据项: 简单来说就是每一层分的条件,分的越细越好找

      磁盘块:磁盘块的大小也就是一个数据页的大小,是固定的 大约是4096字节

      树的高度: 一层IO一次,它决定了查找的时间

      所以我们一般能控制的也就是索引字段的大小,也就是数据项里的数据.

    二  为什么要有索引?

      加速查询速度

        mysql的存储引擎的索引是基于  b+树和hash做的

        innodb  b+树   聚集索引

        myisam  b+树  非聚集索引

        memory   hash   

       b+树做了什么,为什么他的索引会快?

        在非叶子节点不存储相关信息,只存放指针:让输得高度降低了,所有数据寻找的时间是一定的

                           能够直接找到对应的数据

        叶子节点的各个数据之间使用双向连接来表示: 能够更好的进行范围排序相关的操作

        

        要想缩短树的高度,我们能做的事情: 就是让每一列的宽度尽量的小

    三  聚集索引和非聚集索引;

      聚集索引 (有覆盖索引,可以直接从叶子节点拿到数据,也可以没有覆盖索引,叶子节点不能直接难道数据,拿到的只是一个地址,需要通过辅助索引进一步找到该数据)

    辅助索引:如果未定义聚集索引,mysql会取一个唯一索引(unique)注意是只含非空列(自己找一个不是空列的)innodb会

        把它作为一个聚集索引去查找数据.

    如果辅助索引也没有,innodb就会自己产生一个六个字节的id值,是隐藏的,但是他只能通过他自己特定的方式去触发

        一张表只能有一个

        只在innodb存储引擎中存在

        b+树: 在叶子节点直接拿到数据

        所有的数据存储的物理地址是根据索引顺序: 排序快

      非聚集索引

        每张表可以有多个

        在myisam ,innodb中都存在

        b+ 树 : 叶子节点会存储数据的指针

        所有的数据存储的物理地址和索引顺序无关

        如果创建多个非聚集索引,那么insert delete 数据都会非常慢,并且占用更多的内存和硬盘

    四   mysql所以管理:

        1 mysql中的primary key , unique ,联合唯一也都是索引,这些索引除了加速差以外,还有约束功能. 

        2 唯一索引:

          主键索引 :primary key (加速查找+约束,且不为空,不能重复)

          唯一索引:unique (加速查找+约束,且不能重复)

        3    联合索引:

                            primary key(id,name) 联合主键索引

           unique(id,name)  联合唯一索引

           index(id ,name) 联合普通索

    五 索引的两大类型hash与btree

      

    #我们可以在创建上述索引的时候,为其指定索引类型,分两类
    hash类型的索引:查询单条快,范围查询慢
    btree类型的索引:b+树,层数越多,数据量指数级增长(我们就用它,因为innodb默认支持它)
    
    #不同的存储引擎支持的索引类型也不一样
    InnoDB 支持事务,支持行级别锁定,支持 B-tree、Full-text 等索引,不支持 Hash 索引;
    MyISAM 不支持事务,支持表级别锁定,支持 B-tree、Full-text 等索引,不支持 Hash 索引;
    Memory 不支持事务,支持表级别锁定,支持 B-tree、Hash 等索引,不支持 Full-text 索引;
    NDB 支持事务,支持行级别锁定,支持 Hash 索引,不支持 B-tree、Full-text 等索引;
    Archive 不支持事务,支持表级别锁定,不支持 B-tree、Hash、Full-text 等索引;

    六 创建/删除索引的语法:

    #方法一:创建表时
          CREATE TABLE 表名 (
                    字段名1  数据类型 [完整性约束条件…],
                    字段名2  数据类型 [完整性约束条件…],
                    [UNIQUE | FULLTEXT | SPATIAL ]   INDEX | KEY
                    [索引名]  (字段名[(长度)]  [ASC |DESC]) 
                    );
    
    
    #方法二:CREATE在已存在的表上创建索引
            CREATE  [UNIQUE | FULLTEXT | SPATIAL ]  INDEX  索引名 
                         ON 表名 (字段名[(长度)]  [ASC |DESC]) ;
    
    
    #方法三:ALTER TABLE在已存在的表上创建索引
            ALTER TABLE 表名 ADD  [UNIQUE | FULLTEXT | SPATIAL ] INDEX
                                 索引名 (字段名[(长度)]  [ASC |DESC]) ;
                                 
    #删除索引:DROP INDEX 索引名 ON 表名    

    总结:

      

    1. 一定是为搜索条件的字段创建索引,比如select * from s1 where id = 333;就需要为id加上索引
    
    #2. 在表中已经有大量数据的情况下,建索引会很慢,且占用硬盘空间,建完后查询速度加快
    比如create index idx on s1(id);会扫描表中所有的数据,然后以id为数据项,创建索引结构,存放于硬盘的表中。
    建完以后,再查询就会很快了。
    
    #3. 需要注意的是:innodb表的索引会存放于s1.ibd文件中,而myisam表的索引则会有单独的索引文件table1.MYI
    
    MySAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在innodb中,表数据文件本身就是按照B+Tree(BTree即Balance True)
    组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。
    这个索引的key是数据表的主键,因此innodb表数据文件本身就是主索引。 因为inndob的数据文件要按照主键聚集,所以innodb要求表必须要有主键(Myisam可以没有),
    如果没有显式定义,则mysql系统会自动选择一个可以唯一标识数据记录的列作为主键
    ,如果不存在这种列,则mysql会自动为innodb表生成一个隐含字段作为主键,这字段的长度为6个字节,类型为长整型.

    七 : 正确使用索引

       待续......

      

                                                                    

    ---恢复内容结束---

  • 相关阅读:
    Sqlmap使用详解
    WEB漏洞学习手册
    量压形态的使用方法
    sql执行过程及常见优化手段
    什么是JavaScript 函数作用域
    git http 拉取代码 自动输入用户名和密码
    PHP 报文件写入无权限 file_put_contents failed to open stream: Permission denied in xxxxx on line 2
    记一次 解决PHP Linux服务器报 打开文件数过多的异常
    微信开发 坑 记录帖
    python 安装 cv2 注意事项 填坑 opencv-python 找不到指定的模块
  • 原文地址:https://www.cnblogs.com/systemsystem/p/10180585.html
Copyright © 2020-2023  润新知