首页 > 代码库 > MySQL索引介绍
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;
好了,索引的总结就到这里,之后Qi号如果有新的感悟会继续更新文章,有的小伙伴们有不同的意见也可以评论,多多建议~~
最后Qi号与大家分享一道超牛掰的面试题:
题目:
数学上有一种数列叫斐波那契数列:0,1,1,2,3,5,8,13,21,34,55,89,144这些数列中,第一个数是0,第二个数是1,从第三个数起,每个数恰好是前两个数值和
要求写出一个函数方法,方法内输入一个值,最后输出的是小于这个值之前的所有数字;
今天Qi号分享的是职场上的一句话:
发现问题一定要及时解决问题,所有的理由在领导眼里都是借口。
MySQL索引介绍