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号与大家分享一道超牛掰的面试题:

posted @ 2017-04-08 13:41  侯大宝  阅读(211)  评论(0编辑  收藏  举报