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号分享的是职场上的一句话:
发现问题一定要及时解决问题,所有的理由在领导眼里都是借口。
MySQL索引介绍的更多相关文章
- mysql性能优化-慢查询分析、优化索引和配置 MySQL索引介绍
MySQL索引介绍 聚集索引(Clustered Index)----叶子节点存放整行记录辅助索引(Secondary Index)----叶子节点存放row identifier-------Inn ...
- Mysql索引介绍及常见索引(主键索引、唯一索引、普通索引、全文索引、组合索引)的区别
Mysql索引概念:说说Mysql索引,看到一个很少比如:索引就好比一本书的目录,它会让你更快的找到内容,显然目录(索引)并不是越多越好,假如这本书1000页,有500也是目录,它当然效率低,目录是要 ...
- Mysql索引介绍及常见索引的区别
关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车.对于没有索引的表,单表查询可能几十万数据就是瓶颈,而通常大型 ...
- MySQL索引介绍+索引的存储类型+索引的优点和缺点+索引的分类+删除索引
什么是索引? 索引用于快速找出某个列中有一特定值的行,不使用索引,mysql必须从第1条记录开始读完整的表,直到找出相关的行.表越大,查询数据所花费的实际越多.如果表中查询的列有一个索引,mysql能 ...
- Mysql系列(六)—— MySQL索引介绍
前言 索引种类 索引维护 如何使用索引 一.索引索引种类 MySQL中索引主要包含以下几种: 普通索引 唯一索引 主键索引 联合索引 全文索引 二.索引维护 在简述了索引的类型后,再来了解下如何维护索 ...
- MySQL索引介绍和实战
索引是什么 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构. 可以得到索引的本质:索引是数据结构,索引的目的是提高查询效率,可以类比英语新华字典,根据目录定位词 ...
- mysql 索引介绍与运用
索引 (1)什么是索引? 是一种提升查询速度的 特殊的存储结构. 它包含了对数据表里的记录的指针,类似于字典的目录. 当我们添加索引时会单独创建一张表来去存储和管理索引,索引比原数据大,会占用更多的资 ...
- Mysql索引(一篇就够le)
我想很多人对mysql的认知可能就是CRUD(代表创建(Create).更新(Update).读取(Retrieve)和删除(Delete)操作),也不敢说自己会用和熟悉mysql,当然我就是其中一个 ...
- php面试专题---Mysql索引类型、介绍及优点
php面试专题---Mysql索引类型.介绍及优点 一.总结 一句话总结: 精品视频讲解里面的资料来源也是通过各种资料,比如博客.书等,只不过是基于讲解者的知识体系有整理的过程 1.B-Tree索引三 ...
随机推荐
- eclipse的应用和整理
1如何在eclipse中获取动态项目的绝对路径 1.鼠标选中项目,右击菜单,选择properties2.出来弹出框,选择resource,location的值就是你想要的项目绝对路径 JSP中获得当前 ...
- C# 中关于radiobutton控件的使用
在一个Form窗口中定义了3个radiobutton,radioButton1.radioButton2和radioButton3,以及button1和button2(这里可以是其他控件) 为了实现单 ...
- #单元测试#以karma+mocha+chai 为测试框架的Vue webpack项目(二)
学习对vue组件进行单元测试,先参照官网编写组件和测试脚本. 1.简单的组件 组件无依赖,无props 对于无需导入任何依赖,也没有props的,直接编写测试案例即可. /src/testSrc/si ...
- Visual Studio 2012 未找到与约束 ContractName问题,及printf unsafe问题
1.用VS 2012 创建c++项目失败,提示未找到与约束 ContractName .............的错误 解决办法:下载VS 2012 补丁,很小的一个补丁,不过很管用 地址:http: ...
- python manage.py startapp app 时候报错No module named _sqlite3
python manage.py startapp app 报错如下: File "manage.py", line 10, in <module> execut ...
- jQuery的datatable的destroy属性,和$("#test").dataTable().fnDestroy();区别,两者的区别
jQuery的datatable的destroy属性,和$("#test").dataTable().fnDestroy();区别,两者的区别. 1 destroy属性是,销毁实例 ...
- ListView与SimpleAdapter
Adapter可以视作控件与数据之间的桥梁 对ListView做自由布局和填充需要使用到Adapter,这里我们采用SimpleAdapter. 简单来说: 1.定义一个ListItem,其数据结构是 ...
- java常见验证邮箱、电话号码、日期等格式
package besttone.utils; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 90%的验证 ...
- Python—XML
什么是xml XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML 标签没有被 ...
- JS JavaScript中的文档碎片 DocumentFragement JS性能优化
文档碎片是什么: 如果我们要在一个ul中添加100个li,如果不使用文档碎片,那么我们就需要使用append经常100次的追加,这会导致浏览器一直不停的渲染,是非常消耗资源的.但是如果我们使用文档碎片 ...