• 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
  • 相关阅读:
    php数组·的方法1-数组的操作
    第十一章:DOM扩展
    第十章:DOM
    hxq的库
    第八章:BOM
    第七章:函数表达式2
    第七章:函数表达式
    第五章:引用类型(一)-Object和Array
    舌尖上的程序猿
    计算矩阵运算的乘法次数
  • 原文地址:https://www.cnblogs.com/xujinjin18/p/9368391.html
Copyright © 2020-2023  润新知