mysql入门必备
发布时间:2022-08-09 11:24:39 所属栏目:MySql教程 来源:互联网
导读:自己对mysql的一点理解吧,当然技术有限,就借鉴的一些大佬的文章,希望能帮助到大家!( ̄▽ ̄)ノ 1.什么是mysql? mysql是关系型数据库,比较常见的关系型数据库有mysql/oracle/sql server/sqlite ;存数据使用的是表,这样的话结构比较固定,易于维护,我
自己对mysql的一点理解吧,当然技术有限,就借鉴的一些大佬的文章,希望能帮助到大家!( ̄▽ ̄)ノ 1.什么是mysql? mysql是关系型数据库,比较常见的关系型数据库有mysql/oracle/sql server/sqlite ;存数据使用的是表,这样的话结构比较固定,易于维护,我们通常使用crud去操作表中的数据;这里的crud就是insert,delete,update,select 与之相对的是非关系型数据库,如redis/mongoDB,是一种key-value形式的存储,不理解的可以简单的看作json那样存储的; 至于两者之间的优缺点可以简单参考这个大哥的博客 2.mysql中的sql语言有几种? 在mysql中,有4种语言: (1)DDL -- Data Definition Language,中文是数据库定义语言,也就是create(创建数据库或者数据表),alter(修改数据表相关信息),drop(删除数据库或者数据表)这几个常用关键字, 只有创建表的时候,或者我们后期需要给表加索引之类的可能会用到,平常用的比较少 (2)DML-- Data Manipulation Language,中文是数据库操作语言,这个也就是我们常用的crud操作,注意,我们还需要记住一个explain关键字,这个explain是用于分析你写的sql语句执行效率的一个好用的工具,可以查看到有没有使用到索引等信息 (3)一笔带过 DCL:数据库控制语言,例如Grant —为用户授予权限 revoke–撤回授权权限 TCL:事务控制语言,例如Commit --保存已完成的内容,rollback —回滚 3.什么sql最影响mysql效率? 不考虑读写分离的情况下,最影响mysql的效率的就是查询语句,也就是你写的那一大串的select xx from xx这种,所以我们一般就是优化查询语句; 4.如何分析sql的执行效率呢? 我们要找到一些执行的很慢的sql,首先我们需要开启mysql的慢查询日志,设置时间限制,当超过这个时间限制的就记录到日志文件中,然后我们就用下面这种方式分析就ok了!那么怎么开启慢查询日志呢?看这里 使用explain查看sql的执行计划,如下所示,有兴趣的可以看看执行计划中每个字段的意思,例如possible_keys 表示可能使用的索引,key 表示实际使用的索引等等,有兴趣的可以看看这个大哥的博客 注:还有一种更加细致的分析sql性能消耗的,使用show profile,有兴趣的可以看看这个 5.通常如何优化查询sql呢? 从上面我们知道了如何分析一条sql中的效率,最常用的优化方案便是加索引; 6.索引是什么? 索引是个什么东西呢?这里涉及到数据结构中的一个B+树,索引在磁盘中是以文件的形式存在,其实可以看做一张表,也是会占用物理空间的!!! 通俗易懂一点的解释就是书籍目录:在word文档中目录肯定也是占物理空间的对吧,而且我们点击目录就可以直接跳转到对应的正文处,所以我们可以大概的知道索引可能存的是实际数据的物理地址空间(后面也可以存实际的数据哦!取决于引擎) 那么问题来了,所有索引都是这么存的吗? 7.索引的分类 以innodb为例,索引分为两种: (1)聚集(clustered)索引,也叫聚簇索引,一个表只能有一个。 (2)非聚集(unclustered)索引,也叫稀疏索引,或者叫做普通索引,多个。 看名字就觉得想放弃了,其实聚集索引就是主键索引,其他的索引都叫做非聚集索引(比如联合索引,唯一索引啥的,这些都是非聚集索引的逻辑分类) 8.两种索引的不同之处 首先说一下mysql中innodb存数据的方式,首先我们要有这么一个想象的画面,数据库表的数据,都是存放在聚集索引下面的,下面画个图就了解了: 有这么一张表,id是主键(这里有个地方需要注意,对于innodb引擎,如果我们在建表语句那里有指定主键,那么就ok,没有指定主键,mysql就会偷偷的创建一个主键索引,我们是看不到的,表中也没有) 那么主键索引应该就是这样的,下图所示,这个时候实际的数据就是存到主键索引的叶子节点中的! 现在问题来了,那么非聚集索引是怎么存的呢?例如我把上表中name字段添加索引... 然后我们思考,非聚集索引的结构也是b+树,和聚集索引一样,不同的是叶子节点中村的就不是实际的数据了,而是主键的值; 我们首先查询到叶子节点的主键的值,然后通过这个主键的值再到聚集索引中查询一次,才能拿到真正的数据!也就是说,通过非聚集索引查数据,一般要查询两次才行!第一次查询出来的是主键的值,第二次通过主键的值去聚集索引中查询实际的数据(用专业一点的词语叫做回表); 为了更清晰的理解聚集索引和非聚集索引,我在网上偷了一张比较好理解的图(可惜不是b+树,但是原理一样),如下所示,左边是聚集索引,叶子节点存的是实际的数据;右边是非聚集索引,存的是聚集索引的值; 9.是否所有的非聚集索引查询的时候都需要查询两次呢(知识点:覆盖索引)? 在第8点中说了一般是查询两次,通常有 "一般" 这种词语就说明还有特殊情况; 例如还是以上面的那个表为例,首先给name添加索引,那么看看这个sql:select id from user where name = "小王"; 首先这个sql肯定会走非聚集索引name,找到叶子节点的存的id为1,这时你觉得还需要把1拿去再去查一次聚集索引么?肯定不需要啊,因为我们sql中只需要这个id就行了啊,已经查询出来了,为什么还要去把那一条数据查询出来呢? 这个时候只需要查询一次就ok了,专业名词叫做覆盖索引,专业解释为:如果一个索引包含(或覆盖)所有需要查询的字段的值,称为‘覆盖索引’,即只需扫描索引而无须回表。 (编辑:呼伦贝尔站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |