mysql入门学习归纳(1) | 青训营笔记

154 阅读9分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第5篇笔记

mysql快速入门归纳

前言

随着大作业项目和课程的进行,无论是存储数据本地实现,还是在云端,为服务提供数据的管理,都起着至关重要的位置。

因为我们不可能把所有的数据放置在内存中,也不可能把数据分散的没有章法的存在磁盘中。这样不仅无法保证数据的持久性,也无法保证应用的功能正常的实现。

在这种前提下,我在着手大作业的同时,开始了对数据库的学习与应用。

软件选择

首先,对于mysql的版本不必过于纠结,不论是高版本的8.0,还是稳定一些的5.7.

在具体应用上的差别不会特别大。

不过5.7在安装配置的时候需要比较大的功夫。

如果是初次安装可以查看如下视频来进行安装 —————>链接

其次就是可视化平台的选择,目前主流的有这样几个,一个是Navicat,另一个就是SQLyog

这两个同为可视化的sql数据管理平台,功能,基础差别不大。所以这里我选择的是Navicat

,可视化平台更多的是随时能够打开及时的查看或者说进行一些操作。但是大多数时候都是以命令的方式来解决的。所以大家尽量不要过度依赖软件。

有句话怎么说来着,打铁还得写sql。不sql,无兄弟。

因为我的电脑中用的toolbox来管理全家桶,所以直接顺手用了datagrip来进行sql语句的撰写。整体上还是很智能的有时候在复杂的多表查询的时候也能提醒我正确的约束条件等等。也是sql人的一款很优秀的平台了。

sql语句的归纳与个人注解

其实大多数的sql语句都算是增删改查,不过我们也会对其进行一些列的分类。

其中我们最常用,也是接触到最多的就是dml语句,

按照定义,我们把select,delete,update归总为dml语句。之所以我在这里想要去提到这个概念,主要是因为后面的一个部分,我们很需要这个概念来帮助我们来去区分和理解一些很重要的概念(事务与隔离级别)。不过我们这个有时间再去细说。

可能的优化位置与存储引擎理解

我们先对查询以及索引来开始谈起,我们可以从数据库的各个引擎所支持的锁可以看到,我们默认使用的innoDB

他是支持行锁的,也就是说,当我们去执行一条sql语句对数据库进行以某个条件的查找时,速度会非常慢,及时找到了符合条件的数据,他也会继续的向下查找,而不是及时的返回对应的数据。所以相对于InnoDB,假若我们的需求只是进行一些简单的CRUD,建议可以使用MyISAM,其访问速度快,在没有事务以及外键的需求的情况下,是个不二的选择。

对比于上两个存储引擎,还有另外一个异类,就是MEMORY,他并不会实际的把数据存在文件里,而是使用存在内存中的内容来创建表,因为其本身的数据是放在内存中的,而且默认采取的HASH索引,省去了io的部分,使得其速度非常的快,不过一个事情有其突出的优点,其大概率会有个比较重大的缺点,即一旦MySQL服务关闭,使用MEMORY存储引擎的表就会消失。但是有一句话一定要说清楚,是表中的内容消失,并不是表的结构消失,表的结构还是存在的。

基于这种特性,我们可以在如下可能的开发环节中对数据库进行优化。

如果我们想要去存储一些会经常产生变化的数据,并且这个状态的存在与否并不会影响到项目的具体流程的时候,由于其CRUD的操作量很大,在很多个用户同时来操作的时候,如果我们使用的为默认的InnoDB存储引擎,其速度往往是不能接受的。这个时候我们就可以采用MEMORY来进行优化。就比如社交软件的状态等等。

从优化的方面来讲,索引也是一个非常节约成本的一个方案,我们可以试着创建一个800万条数据的表,在经过接近十分钟的创建后,我们可以看到,我们的文件大小已然是达到了523mb这样的一个大小。这时候可以这么讲,我们的每次查询都可谓是举步维艰,速度非常慢,即使从数字上看并不是特别大,但对于我们人来说,这个速度同样是无法接受的。

这时候我们就可以以其中一个字段来创建索引。在创建索引过后我们可以大概的观察到,我们文件的大小来到了680mb。

但是这时候的查询效率可比添加索引之前快的不是一星半点。同时我们也能很直观的观察到,这是一种很经典的以空间换时间的行为。不过在其速度的对比下,其空间的大小就没有特别重要了。

在这里可能会像,那我是不是创建了索引就完事大吉了。其实并不是,我们创建的索引背后是一种数据结构,往往是根据某一个字段来创建的,即当我们查询另外一个没有被创建索引的字段时,同样速度还是很慢。

如方才所说,其查找的快速是利用了数据结构,同样,其较慢的insert,delete,update操作也是因为此,因为当我们使用一种数据结构的同时,删除与更改所需要的维护成本也就随之而来了。所以讲,我们在创建索引时,也要尽量考虑表的用处。再去因地适宜的进行优化。

优化优化,切记是正向优化,切不可一心向好而最后变成了负优化。

最后提醒佳人们一个还是蛮重要的事情,就是数据库,如果里面的内容很重要,请一定要记得保有备份,谨防手抖删库的发送

# 数据库的备份以及恢复 使用场景:(1)存入另一个DBMS (2)定时存入文件系统
# mysql -u root -p  (登录mysql)
# mysqldump -u root -p -B database_name ... > file_path + file_nam.sql (dos备份整个数据库)
# source file_path + file_nam.sql (mysql命令行执行)(即登录到mysql服务后再去执行)
# mysqldump -u root -p  database_name table1_name table2_name ... > file_path + file_nam.sql (dos环境下保存某一数据库的某几张表)
#  						(这里千万不要手勤多写个 -B 否则会报错)
# 数据库的备份以及恢复 转为文件和读取文件

MySQL事务

由多个 dml (update,insert,delete)语句组成,当成一个整体,要么全部=成功,要么全部失败

在执行dml语句时,mysql会在表上加锁, 事务的基本操作

start transaction;  -- (开始一个事务)
savepoint   ;       -- (保存点名,设置保存点 )
rollback to   ;     -- (保存点名,回退事务)
rollback      ;      -- (回退全部事务)(一旦回退到最初的保存点,会把中间其他保存点删除)
commit       ;       -- (提交事务,所有操作生效,没有机会再回退了)(删除保存点,释放锁,所有数据自动生效)

细节:

回滚前提: 手动开始了事务--》设定了保存点 1.若不设定事务,则dml语句是自动提交的,不可以回滚 2.若开始一个事务,但没有设定保存点,可以执行 rollback 会默认回滚到事务开始的状态 3.在事务提交之前,可以创建多个保存点 4,可以在事务提交前,可以选择回退到特定的保存点 5.mysql的事务机制,在innoDB支持,myisam引擎不支持 6.开启事务 :

 start transaction / set autocommit = off

事务的隔离级别

多链接开启各自的事务操作数据库时,数据库设置隔离操作,以保证哥哥来凝结在获取数据时的正确性 若不考虑隔离性,则会出现以下现象 :

  1. (脏读) 当一个事务读取到了另外一个事务还未提交的修改时,称之为产生了脏读
  2. (不可重复读) 当同一个查询在同一个事务中,由于其他事务所做的** 修改 删除 ** ,导致每次返回的结果不一样 主要针对于,修改,和删除操作,(个人小结,即在个人进行事务操作时,被其他事务进行的修改或删除操作改变了现有的表)
  3. (幻读) 跟不可重复读类似,这里主要是针对** 插入 ** 操作

全局修改 : 一般情况不要去更改隔离级别

可以在 my.ini文件中 在mysqld下 添加语句 transaction-isolation = READ-UNCOMMITTED(四种可选)

隔离级别脏读不可重复读幻读加锁?单元格
Read uncommitted(Y)(Y)(Y)( )单元格
Read committed(X)(Y)(Y)( )单元格
Read committed(X)(X)(X)( )单元格
Serializabl(加锁)(X)(X)(X)(加锁)单元格

结束语

事务的相关知识较多,包括隔离级别与各种各样的分布式锁也还有待学习。如上是我对于我在学习期间遇到的问题,以及自我的小总结。

若是能够为您的入门提供到了一些帮助,那就是小生的三生之幸运。愿我们能在更高的山峰相遇。