• MySQL索引


    什么是索引?

    描述 : 为表设置索引,会按照设置的索引生成索引文件,查询时通过索引文件来查询,从而提高查询速度

    作用 : 可以大大提高查询速度

    副作用 : 会降低更新表(insert,update,delete)的速度,因为更新表时,mysql不仅要保存数据,还要保存索引文件

    索引分类 : 单列索引(多个单列叫多列索引)和组合索引, 单列索引:一个索引只包含单个列, 组合索引:一个索引内有多个列

    怎么使用 : 在WHERE后边使用有索引的字段作为条件语句

    索引类型

    1.普通索引(INDEX)

    特性 : 没有任何限制,可以重复

    创建索引 : CREATE INDEX 索引名 ON 表名 (字段名(length))

    修改表结构添加索引 : ALTER TABLE 表名 ADD INDEX 索引名(字段名(length) )

    创建表的时候指定索引 : CREATE TABLE testtable(id int primary key, ... , INDEX [索引名] (字段名(length))  );

    删除索引 : DROP INDEX 索引名 ON 表名

    创建组合索引 : ALTER TABLE 表名 ADD INDEX 索引名(字段1(length), 字段2(length), ... )

    2.唯一索引(UNIQUE INDEX)

    特性 : 索引的值必须唯一,如果是组合索引,则组合索引必须唯一,单个列的值不必唯一.

    创建索引 : 同上普通索引, 把INDEX改成UNIQUE INDEX即可,修改表结构添加索引,建表时添加索引时可以只用UNIQUE

    3.全文索引(FULLTEXT INDEX)

    省略

    4.多列索引

    MYSQL在查询时,将选择一个限制最为严格的索引使用

    5.组合索引(最左前缀)

    最左前缀 : 查询条件要按照索引的从左到右的顺序使用,否则不会使用索引

      比如创建了组合索引 : ALTER TABLE mytable ADD INDEX index_name_sex (name(24), sex(1)  )

      实际上在查询时只有两种组合会用到索引,分别是:

        name, sex

        name

      其他的排列顺序就不会使用索引,比如sex, name 或者 sex

      不使用索引的例句 : SELECT * FROM mytable WHERE sex=1 AND name='zhangsan';

    聚集索引和非聚集索引

    一.聚集索引和非聚集索引的定义

     MySQL, InnodDB存储引擎下:

      默认主键为聚集索引,如果没有设定主键,则第一个唯一索引作为聚集索引.如果也没有唯一索引,innoDB会隐式定义一个6字节的rowid主键来作为聚集索引

      除聚集索引外的索引,是非聚集索引

    二.聚集索引

    聚集索引就像是字典里的拼音目录

    一张表只有一个聚集索引,(默认就是主键)

      数据在磁盘中的物理地址排列方式,与聚集索引的顺序相同,如果我们查询id靠后的数据,那么这个数据的物理地址也靠后

      如果在数据中间部分插入一个新的数据,那么后边的数据物理位置全都要改变!

    三.非聚集索引

    非聚集索引就像是字典里的偏旁索引,索引的顺序未必就是数据的排列顺序.

    BTREE索引和HASH索引

    不同的引擎对于索引有不同的支持:InnoDB和MyISAM默认的索引是Btree索引;而Mermory默认的索引是Hash索引

    BTREE索引

    Btree索引是以B+树为存储结构实现的,Innodb和MyISAM默认的索引是Btree索引

    但InnoDB和MyISAM所使用的Btree存储结构有很大不同

    一.MyISAM

     1).MyISAM的主索引

      上图是MyISAM主索引的结构图, 以Col1作为主键,我们看这棵树的叶节点保存的是数据的物理地址

      在MyISAM中,主索引和辅助索引在结构上没有任何区别,唯一的区别是主索引要求key唯一,而辅助索引的key可以重复

    2).MyISAM的辅助索引(在Col2上建立的)

    上图可见,MyISAM下,主索引和辅助索引的索引结构没有不同.都是在叶节点保存数据的物理地址

    所以,MyISAM中检索索引的方法是

      1.按照Btree搜索算法搜索索引,如果key存在,则取出起data域的值

      2.以data域的值为地址,读取对应的数据.

    MyISAM的索引文件和数据文件(表)是分离的

    MyISAM的索引方式也叫做“非聚集”的,之所以这么称呼是为了与InnoDB的聚集索引区分

    二.innoDB

    innoDB存储引擎下,数据文件本身就是索引文件,表本身就是主索引,辅助索引文件其实也是一张表

    1).innoDB下的主索引

    上图可见,innoDB的主索引(同时也是数据文件)的叶节点包含了完整的数据,这种索引叫聚集索引(以主键作为索引),因为innoDB的数据文件本身要按照主键聚集,所以innoDB要求表必须有主键.而innoDB的辅助索引和主索引不同.

    2).innoDB的辅助索引

    上图可见,innoDB的辅助索引保存的是主键的值,使用这种索引需要检索两遍索引

      1.首先检索辅助索引获得主键.

      2.然后用得到的主键在主索引中获取数据.

    BTREE索引总结

    1.innoDB主索引是聚集索引,因为数据要按照主键聚集. 而innoDB的辅助索引和MyISAM的主索引和辅助索引则是非聚集索引.

    2.innoDB的主索引的索引文件就是表本身,保存完整数据,辅助索引保存的是主键id,MyISAM的主索引和辅助索引都保存的是数据的物理地址,唯一的区别是主索引的key必须唯一

    3.使用innoDB存储引擎,表必须要有主键, 而使用MySIAM存储引擎,表没有主键也不影响.

    4.使用索可以引消除排序,order by按照索引来写即可.(可以提高速度)

    Hash索引

    先不写,以后有需要了再来写

     参考文章: 

    https://www.cnblogs.com/shijingxiang/articles/4743324.html

    https://www.jianshu.com/p/bf30c2b9a0cf

    f

  • 相关阅读:
    leetcode231
    leetcode326
    leetcode202
    leetcode121
    leetcode405
    leetcode415
    2019-9-2-win10-uwp-应用转后台清理内存
    2019-9-2-win10-uwp-应用转后台清理内存
    ACM学习心得
    ACM学习心得
  • 原文地址:https://www.cnblogs.com/jinyu59/p/10851160.html
Copyright © 2020-2023  润新知