• python-study-42


    索引介绍

    一:为什么要有索引
    
    索引是用来优化查询效率(速度)的
    
    没有索引的话,对于大数据的表,就只能每次都遍历一遍,数据量越大,耗时越多
    有索引的话,可以提升好几个数量级的速度
    
    一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句的优化显然是重中之重。说起加速查询,就不得不提到索引了。
    
    二:什么是索引
    索引在mysql中叫做key(键)
    
    是存储引擎用于快速找到记录的一种数据结构
    
    索引可以理解为字典中的目录部分
    是以类似二叉树的形式组织的,一般2-4层
    
    三:索引误区
    索引多:提升了查询速度,但是磁盘IO会爆掉
    索引少:影响查询速度,提升了应用性能
    因此要具体分析
    View Code

    索引原理

    一 索引原理
    
    通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件
    索引的排列是从左到右越来越大的
    
    二 磁盘IO与预读
    
    磁盘读取数据靠的是机械运动
    读数据时间=寻道时间+旋转延迟+传输时间=9ms
    寻到时间:5ms
    旋转延迟:4ms
    传输时间:从内存到磁盘或从磁盘到内存,忽略不计
    
    所以要尽量减少磁盘IO
    
    预读:
    考虑到磁盘IO是非常高昂的操作,计算机操作系统做了一些优化,当一次IO时,不光把当前磁盘地址的数据,而是把相邻的数据也都读取到内存缓冲区内,因为局部预读性原理告诉我们,当计算机访问一个地址的数据的时候,与其相邻的数据也会很快被访问到。每一次IO读取的数据我们称之为一页(page)。具体一页有多大数据跟操作系统有关,一般为4k或8k,也就是我们读取一页内的数据时候,实际上才发生了一次IO,这个理论对于索引的数据结构设计非常有帮助。
    View Code

    索引的数据结构

    
    
    这种数据组织结构就是索引
    
    b+树:
    
    这种数据结构能够,每次查找数据时把磁盘IO次数控制在一个很小的数量级
    
    b+树的查找IO;
    如果是百万量级的数据:没有索引要有百万次的IO
    有了索引只需要3次IO即可,由此可见索引的优势
    
    创建索引注意事项:
    1.索引字段要尽量的小
    io次数取决于b+树的高度,索引字段越小,每个磁盘块的数据项就能存越多,高度就越低。
    
    2.索引的最左匹配特性
    View Code

    聚集索引和辅助索引

    聚集索引与辅助索引相同的是:不管是聚集索引还是辅助索引,其内部都是B+树的形式,即高度是平衡的,叶子结点存放着所有的数据。
    
    聚集索引与辅助索引不同的是:叶子结点存放的是否是一整行的信息
    
    由于实际的数据页只能按照一棵B+树进行排序,因此每张表只能拥有一个聚集索引
    
    聚集索引能够在B+树索引的叶子节点上直接找到数据
    
    辅助索引的叶子节点不包含行记录的全部数据。
    叶子节点除了包含键值以外,每个叶子节点中的索引行中还包含一个书签该书签用来告诉InnoDB存储引擎去哪里可以找到与索引相对应的行数据
    
    
    primary key:聚集索引
    其他 key:辅助索引
    View Code

    索引功能

    普通索引INDEX:加速查找
    
    唯一索引:
        -主键索引PRIMARY KEY:加速查找+约束(不为空、不能重复)
        -唯一索引UNIQUE:加速查找+约束(不能重复)
    
    联合索引:
        -PRIMARY KEY(id,name):联合主键索引
        -UNIQUE(id,name):联合唯一索引
        -INDEX(id,name):联合普通索引
    View Code

    创建和删除索引的语法

    #方法一:创建表时
          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 表名字;
    
    
    #方式一
    create table t1(
        id int,
        name char,
        age int,
        sex enum('male','female'),
        unique key uni_id(id),
        index ix_name(name) #index没有key
    );
    
    
    #方式二
    create index ix_age on t1(age);
    
    #方式三
    alter table t1 add index ix_sex(sex);
    View Code

    总结

    索引
    
    http://www.cnblogs.com/linhaifeng/articles/7274563.html#top
    
    索引:加速查询速度,索引不能优化所有的sql语句
    
    读写比例:10:1
    写一般没有性能上的问题
    我们主要是优化查询速度
    
    客户端---服务端
    1 网络延迟问题
    2 服务端磁盘到内存的问题
    网络问题不是我们研究的问题
    我们研究减少磁盘IO问题,就是索引问题
    
    索引就是mysql中的key(primary key index key)
    索引:存储引擎用于快速找到记录的一种数据结构
    
    索引多:每次写都会改变一次索引,造成磁盘IO上升
    索引少:影响查询性能,索引越多,查询越快
    所以要找到平衡点
    
    索引原理:不断缩小查找是数据的范围
    
    索引理解为字典的目录
    
    索引是二叉树的结构形式
    
    pk:加速+约束
    uk:加速+约束
    index key:加速
    
    ps:有索引的字段才可以加速
    
    b+树
    
    primary key:聚集索引
    其他key:辅助索引
    View Code
  • 相关阅读:
    关于求 p_i != i and p_i != i+1 的方案数的思考过程
    poj 3041 Asteroids 二分图最小覆盖点
    poj 1325 Machine Schedule 最小顶点覆盖
    poj 1011 Sticks 减枝搜索
    poj 1469 COURSES 最大匹配
    zoj 1516 Uncle Tom's Inherited Land 最大独立边集合(最大匹配)
    Path Cover (路径覆盖)
    hdu 3530 SubSequence TwoPoint单调队列维护最值
    zoj 1654 Place the Rebots 最大独立集转换成二分图最大独立边(最大匹配)
    poj 1466 Girls and Boys 二分图最大独立子集
  • 原文地址:https://www.cnblogs.com/xujinjin18/p/9368391.html
Copyright © 2020-2023  润新知