• 索引的简单操作


    1.1聚集索引与辅助索引
    # InnoDB存储引擎表示索引组织表,即表中数据按照主键顺序存放。而聚集索引(clustered index)就是按照每张表的主键构造一棵B+树,
    # 同时叶子结点存放的即为整张表的行记录数据,也将聚集索引的叶子结点称为数据页。聚集索引的这个特性决定了索引组织表中数据也是索引的一部分。
    # 如果未定义主键,MySQL取第一个唯一索引(unique)而且只含非空列(NOT NULL)作为主键,InnoDB使用它作为聚簇索引,如果不存在这样的列的话
    # InnoDB就自己产生一个这样的ID值,它有六个字节,而且是隐藏的,使其作为聚簇索引
    # 由于数据页只能按照一棵B+树进行排序,因此每张表只能拥有一个聚集索引
    
    # 辅助索引
    # 在一些查询的时候,如果没有办法使用到聚集索引(主键的话),例如where name = 'panzhenwei'
    # 这是就可以借助辅助索引(由唯一键,index键组成)
    # 与聚集索引的区别是:辅助索引的叶子节点不包含行记录的全部数据
    # 辅助索引包含的相当于是如果以name作为索引键的话,则为{'name字段',name的值,主键id值}
    # 一张表可以有多个辅助索引,在查找的时候,通过辅助索引查找到对应的项,再通过这个索引键对应的主键的id值
    # 获取整行的记录
    索引的定义
    1.2 索引的简单操作
    # 常见的索引方式
    # 普通索引 index
    #
    # 唯一索引:
    #    -主键索引PRIMARY KEY:加速查找+约束(不为空、不能重复)
    #     -唯一索引UNIQUE:加速查找+约束(不能重复)
    #
    # 联合索引:
    #     -PRIMARY KEY(id,name):联合主键索引
    #     -UNIQUE(id,name):联合唯一索引
    #     -INDEX(id,name):联合普通索引
    
    
    # 索引的创建
    # 方法1:在创建表的时候顺便创建索引
    # create  table 表名(字段名 数据类型 [约束条件]  index/unique/ [索引名称] (作为索引的字段名) );
    # create table index2 (id int primary key , name char(10),age int, index cisco (age));
    #
    # 方法2: 在已经创建的表创建索引;
    # create unique/index  索引名 on 表名(字段名称)
    # create index cisco on index1(age)
    #
    # 方法3:在已经创建的表上通过修改的方式,创建一个索引键
    # alter table 表名 add unique/index 索引名 (字段名)
    # alter table index3 add index cisco (age);
    
    # 删除索引:DROP INDEX 索引名 ON 表名字;
    show index from 表名
    show keys from 表名
    # 如果表在已经存在了大量的数据的话,这时候才使用命令建立索引的话,建立索引是有点慢的,但在建立索引之后的关于
    # 对应项的查询的速度会明显加快
    # alter table 表名 add primary key (添加主键的字段的名称)
    # alter table  表名 drop primary key
    
    # 联合索引
    # 新建表建立联合索引
    # create table 表名(a int ,b,int , primary key(a),key 索引名 (a,b));
    # 或者
    # create table 表名(a int ,b,int , primary key(a),index 索引名 (a,b));
    
    # 在已经建立的表中添加索引的条件
    # alter table tt add index 索引名 (a,b)
    #
    # alter table tt  add key 索引名 (a,b )
    
    # 使用的原则:
    # 例如select * from tt where a = xxx and b = xxx
    # select * from tt where a = xxx
    # 但是select * from tt wehre b = xxx  用不到联合索引
    #
    # 所以:注意建立联合索引的一个原则:索引是有个最左匹配的原则的,所以建联合索引的时候,将区分度高的放在最左边,
    # 依次排下来,范围查询的条件尽可能的往后边放。
    
    # 覆盖索引
    # InnoDB存储引擎支持覆盖索引(covering index,或称索引覆盖),即从辅助索引中就可以得到查询记录,而不需要查询聚集索引中的记录。
    常见的索引
    1.3 索引创建需要注意的地方
    # 缺点,建立索引之后,每插入一条数据,索引记录都会重建,导致数据写入会比正常的慢
    # 建立索引和查找的时候需要注意的点
    # 1.在查找的时候,尽量少些使用一个范围比较大或者是条件不明确的符号
    # 例如:>、>=、<、<=、!= 、between...and...、like
    # 2.设置查找条件的时候,尽量将含有索引的条件放在左边(最左前缀匹配原则)
    # 3.建立索引的时候使用区分度比较大的列作为索引
    # 对于and 条件的查找
    # mysql会按照联合索引,从左到右的顺序找一个区分度高的索引字段(这样便可以快速锁定很小的范围),加速查询,先执行区分度比较到的索引的字段
    #
    # 对于or的条件查找
    # 只要一个匹配成功就行,所以对于连续多个or:mysql会按照条件的顺序,从左到右依次判断
    
    # 对于组合索引mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配
    # (指的是范围大了,有索引速度也慢),比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,
    # 如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。
    # - 避免使用select *
    # - count(1)或count(列) 代替 count(*)
    # - 创建表时尽量时 char 代替 varchar
    # - 表的字段顺序固定长度的字段优先
    # - 组合索引代替多个单列索引(经常使用多个条件查询时)
    # - 尽量使用短索引
    # - 使用连接(JOIN)来代替子查询(Sub-Queries)
    # - 连表时注意条件类型需一致
    # - 索引散列值(重复少)不适合建索引,例:性别不适合
    索引的注意点

    从左往右,范围小的优先,具有索引的优先,有利于加快查找速度









  • 相关阅读:
    node eventLoop
    apply call bind
    crm项目-业务实现
    crm项目-stark组件分析
    OA项目-需求分析
    OA项目-表结构
    OA项目-xadmin使用
    路飞学城项目-表结构
    路飞学城项目-支付相关-支付宝第三方支付
    路飞学城项目-支付相关-支付接口
  • 原文地址:https://www.cnblogs.com/vivi0403/p/10110562.html
Copyright © 2020-2023  润新知