zoukankan      html  css  js  c++  java
  • MySQL索引介绍

    引言

      今天Qi号与大家分享什么是索引。其实索引:索引就相当于书的目录

      索引介绍

      用官方的话说就是

      索引是为了加速对表中数据行的检索而创建的一种分散的存储结构。索引是针对表而建立的,它是由数据页面以外的索引页面组成的,每个索引页面中的行都会含有逻辑指针,以便加速检索物理数据。

       一大堆废话,其实索引就是:索引就相当于对指定的列进行排序,排序有利于对该列的查询,可以大大增加查询效率,并且索引实际是存储文件中的并且建立索引也是要消耗系统资源,所以索引会降低写操作的效率。

    索引存储路径

    不论是WAMP还是XAMPP路径 一般为
    MySQL/data/数据库用户名

    MySQL存储引擎

    什么是存储引擎

    MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。


    MySQL常用的存储引擎一般为InnoDB与MyISAM
    各位小白在面试的过程中,面试官经常会问到InnoDB与MyISAM的区别,有些小白一遇到不会的问题就脑门发热,脚开始抖,并且回答的问题也是驴头不对马嘴,很笼统。

    这就跟女友跟男票说肚子疼一样,男票如果只会说多喝点热水,早点休息之类的话估计女友想杀了男票的心都有了,回答不到点上,多喝点热水真的是一句万能的话,下面Qi号可以一起与大家解析这个问题。

    InnoDB: 支持事务、外键 安全 myisam不支持
    InnoDB为聚簇索引:表的数据与索引在同一个文件

    MyISAM:效率高 速度快 稳定性高 易于管理 相对不安全
    MyISAM为非聚簇:表的数据与索引处于不同的文件

    InnoDB有两个文件
    .FRM 表结构
    .IDB 表数据+表索引

    MyISAM有三个文件
    .FRM 表结构
    .MYD 表数据
    .MYI 表索引

    1. 效率高
    MyISAM的索引和数据是分开的,并且索引是压缩的,提高了内存
    使用率,能加载更多索引。
    而InnoDB是索引和数据是紧密捆绑的,没有使用压缩从而会造成
    InnoDB比MyISAM体积庞大不小。
    2. 速度快
    平台上承载的大部分项目是读多写少的项目,而MyISAM的读性能
    是比InnoDB强不少的。
    3. 易于管理
    如果备份数据表的话,MyISAM很方便,只要发给他们对应那表的frm.MYD,MYI的文件,让他们自己在对应版本的数据库启动就行,而Innodb就需要导出xxx.sql了,因为光给别人文件,受字典数据文件的影响,对方是无法使用的。
     4. 如果和MyISAM比insert写操作的话,Innodb还达不到MyISAM的写性能,如果是针对基于索引的update操作,虽然MyISAM可能会逊色Innodb,但是那么高并发的写,从库能否追的上也是一个问题,还不如通过多实例分库分表架构来解决。
     5. 如果是用MyISAM的话,merge引擎可以大大加快应用部门的开发速度,他们只要对这个merge表做一些select count(*)操作,非常适合大项目总量约几亿的rows某一类型(如日志,调查统计)的业务表。
     6. 当然Innodb也不是绝对不用,用事务的项目就用Innodb的。另外,可能有人会说你MyISAM无法抗太多写操作,但是可以通过架构来弥补。


    初级程序员在表述时可以针对效率高,速度快,易于管理这三点就差不多,然后可以说索引的工作原理,回行数据,这样的话给面试官的感觉起码还是有点墨水的。


    索引类型

    1. MyISAM 索引

      B-TREE(二叉树) 常用

      B-tree(多路搜索树)是一种常见的数据结构。使用B-tree结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度。按照翻译,B 通常认为是Balance的简称。这个数据结构一般用于数据库的索引,综合效率较高。

      在MyISAM中索引文件.MYI存储的其实是数据的地址,真实的坐标,数据库快速的找到这个坐标并去定位.MYD中的数据,这个过程专业名词叫做回行,
      重复一遍
      数据库在索引中找到存放指定数据的位置,在磁盘中通过内存定位这个数据找到这个数据。

      hash(哈希)

      哈希插入的数据坐标是有序的,而存放的数据地址是无序的

    2. InnoDB索引
      B-TREE(二叉树) 常用

      在InnoDB中索引文件.IDB文件存储的其实是数据的地址与数据,数据库快速的找到这个坐标的同时也找到了所要的数据,不需要回行去查找其他文件中的数据


    这里Qi号在这里给大家强调一下,并不是MyISAM查询速度一定就比InnoDB快,有一句话说的话,万物皆无定性,扯的有点远了哈,其实呢就是针对不同的数据库环境,不同的存储引擎的执行效率也是不一样的,只不过综合性来讲MyISAM的查询速度大于InnoDB;

    这句话大家可以去思考一下,或者去网上搜集一些资料;

    索引的类别

    普通索引优化查询 排序 分组
    创建索引
    create index in_name on t1(name);
    alter table t1 add index in_name(name);
    查看索引
    show index from t1;
    删除索引
    drop index in_name on t1;
    alter table t1 drop index in_name;
    唯一索引 特殊的普通索引 不能出现重复值
    创建索引
    create unique index un_name on t1(name);
    alter table t1 add unique index un_name(name);
    查看索引
    show index from t1;
    删除索引
    drop index un_name on t1;
    alter table t1 drop index un_name;
    主键索引
    删除自增类型约束
    alter table t1 modify id int(4);
    删除主键索引
    alter table t1 drop primary key;

    添加主键
    alter table t1 add primary key(id);
    添加约束
    alter table t1 modify id int(4) auto_increment;

    索引字段介绍

    · Table

    表的名称。

    · Non_unique

    如果索引不能包括重复词,则为0。如果可以,则为1。

    · Key_name

    索引的名称。

    · Seq_in_index

    索引中的列序列号,从1开始。

    · Column_name

    列名称。

    · Collation

    列以什么方式存储在索引中。在MySQL中,有值‘A’(升序)或NULL(无分类)。

    · Cardinality

    索引中唯一值的数目的估计值。通过运行ANALYZE TABLE或myisamchk -a可以更新。基数根据被存储为整数的统计数据来计数,所以即使对于小型表,该值也没有必要是精确的。基数越大,当进行联合时,MySQL使用该索引的机 会就越大。

    · Sub_part

    如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为NULL。

    · Packed

    指示关键字如何被压缩。如果没有被压缩,则为NULL。

    · Null

    如果列含有NULL,则含有YES。如果没有,则该列含有NO。

    · Index_type

    用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)。

    好了,索引的总结就到这里,之后Qi号如果有新的感悟会继续更新文章,有的小伙伴们有不同的意见也可以评论,多多建议~~

    最后Qi号与大家分享一道超牛掰的面试题:

    题目:

    数学上有一种数列叫斐波那契数列:0,1,1,2,3,5,8,13,21,34,55,89,144这些数列中,第一个数是0,第二个数是1,从第三个数起,每个数恰好是前两个数值和

    要求写出一个函数方法,方法内输入一个值,最后输出的是小于这个值之前的所有数字;

    今天Qi号分享的是职场上的一句话:

    发现问题一定要及时解决问题,所有的理由在领导眼里都是借口。

  • 相关阅读:
    【HDU 4305】Lightning(生成树计数)
    【HDU 1150】Machine Schedule(二分图匹配)
    【HDU 2063】过山车(二分图匹配)
    透过Nim游戏浅谈博弈
    [SCOI2010]字符串
    [SCOI2010]传送带[三分]
    [SCOI2010]序列操作[分块or线段树]
    HDU 5306 Gorgeous Sequence[线段树区间最值操作]
    1455: 罗马游戏[左偏树or可并堆]
    Codevs 5914 [SXOI2016]最大值
  • 原文地址:https://www.cnblogs.com/houdabao/p/6681680.html
Copyright © 2011-2022 走看看