• 索引


    01 为什么要用索引
    对于一个应用来说,对数据库的读写比例基本上是10:1,即读多写少
    而且对于写来说极少出现性能问题,大多数性能问题都是慢查询
    提到加速查,就必须用到索引

    02 什么是索引
    索引就相当于书的目录,是mysql中一种专门的数据结构,称为key(primary key,unique key ,index key)
    索引的本质原理就是通过不断地缩小查询范围,来降低IO次数从而提升查询性能

    强调:一旦为表创建了索引,以后的查询都会先查索引,再根据索引定位的结果去找数据


    03 索引的影响(先有数据,后有索引;索引,亦占硬盘空间)
    1、在表中有大量数据的前提下,创建索引速度会很慢,
    2、在索引创建完毕后,对表的查询性能会大幅度提升,但是写性能会降低


    04 索引的数据结构:
    B+树:只有叶子节点才存放真实数据,其他的(根节点、枝节点)都是虚拟数据 (B+树的高度一般都在2~4层)

    a、一次IO走一个block块
    b、浅蓝-block块; 深蓝-数据项; 黄-指针
    c、为降低IO次数-》降低树的高度-》数据项越小越好(block块大小一定的情况下,数据项越小,存放的数据量最多)-》采用占空间少的做索引(比如id)

    B+树的性质:
    1.索引字段要尽量的小
    2.索引的最左匹配特性(从左到右一次匹配)当b+树的数据项是复合的数据结构,比如(name,age,sex)的时候,b+数是按照从左到右的顺序来建立搜索树的



    数据库中的B+树索引可以分为聚集索引(clustered index)和辅助索引(secondary index),
    聚集索引与辅助索引相同的是:不管是聚集索引还是辅助索引,其内部都是B+树的形式,即高度是平衡的,叶子结点存放着所有的数据。
    聚集索引与辅助索引不同的是:叶子结点存放的是否是一整行的信息

    05 聚集索引(primary key)
    特点:叶子节点存放的一整条数据


    06 辅助索引(unique,index)
    特点:
    如果是按照这个字段创建的索引,
    那么叶子节点存放的是:{名字:名字所在那条记录的主键的值}

    innodb的索引存放在表数据里(.idb)


    a.覆盖索引:只在辅助索引的叶子节点中就已经找到了所有我们想要的数据
    select name from user where name='egon';

    b、回表操作(在往聚集索引查找一遍)
    select age from user where name='egon';


    07、创建索引

    #方法一:创建表时
      CREATE TABLE 表名 (
    字段名1 数据类型 [完整性约束条件…],
    字段名2 数据类型 [完整性约束条件…],
    [UNIQUE | FULLTEXT | SPATIAL ] INDEX | KEY
    [索引名] (字段名[(长度)] [ASC |DESC])
    );


    #方法二:CREATE在已存在的表上创建索引
    CREATE [UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名
    ON 表名 (字段名[(长度)] [ASC |DESC]) ;

    create index idx_name on s1(name);

    #方法三:ALTER TABLE在已存在的表上创建索引
    ALTER TABLE 表名 ADD [UNIQUE | FULLTEXT | SPATIAL ] INDEX
    索引名 (字段名[(长度)] [ASC |DESC]) ;

    #删除索引:DROP INDEX 索引名 ON 表名字;

    drop index idx_name on s1;


    08、其他:
    a、对区别度低的数据不要建索引,且索引不是越多越好

    b、注意范围问题,或者说条件不明确的问题 (条件中出现这些符号或关键字:>、>=、<、<=、!= 、between...and...、like)

    c、mysql中对 a and b and c...的形式,会从左到右先从有索引或区分度高的数据入手开始查询,以减少查询范围
    (能够快速找到一个 判断是否成立 成立的话可以减少查询范围 不成立左右两边都不用判断了)

    d、mysql中对 a or b or c...的形式,会从左至右依次查询 (or的逻辑和and不一样,所以从左到右一个一个查)

    e、索引列不要参与计算,如果非要运算 id*12 =3 ===> id = 312

    f、联合索引的原则:
    区别度高、范围小的放左边,区别度低、范围大的放右边
    (email, name, gender, id):可以搜(email)、(email,name, gender)等(含email),不能搜(id)等
    create index idx_all on s1(email,name,gender,id);

  • 相关阅读:
    好用的开源产品搜集;开源软件,开源系统,开源项目;
    windows10 双系统安装后,grub2 引导修复(亲自实验);grub2 命令行 手动加载内核;fedora 29 系统grub2引导修复;
    C 实战练习题目40
    C 实战练习题目39
    C 实战练习题目38
    C 实战练习题目37 – 排序
    C 实战练习题目36 – 求100之内的素数
    C 实战练习题目35 -字符串反转
    C 实战练习题目34
    C 实战练习题目33 – 质数(素数)判断
  • 原文地址:https://www.cnblogs.com/kingyanan/p/9460127.html
Copyright © 2020-2023  润新知