MySQL 学习笔记(一)

2020-11-24  本文已影响0人  Whyn

[TOC]

前言

本人一直认为『数据』是应用程序的源泉,我们的日常生活都会产生大量的数据,当我们对这些数据进行收集、分析、整合时,就可以充分挖掘出蕴藏在这些数据背后的大量价值,同时这些数据又会反哺给程序,创造出更多的工作岗位,使更多的人使用我们的程序。

比如,数据的收集、过滤通常交由后台服务器进行,因此后端工程师应运而生;
比如,数据需要展示给到用户,方便用户查看,因此前端/移动工程师应运而生;
比如,随着数据的持续收集,数据量会不断增加,这时就需要进行大数据处理,大数据处理工程师应运而生;
比如,当数据量达到一定程度时,就可以从这些海量数据中找出一定的规律,使之能预测匹配某类事务,人工智能也应运而生了;
\cdots

以上还只是站在程序员的角度上看待数据,而在资本市场上,数据更是被誉为『21 世纪的石油』。未来的世界是数据的世界,谁能够掌握更多数据,并挖掘出数据背后的价值,谁就是市场的赢家。

既然数据这么重要,那么无论我们对数据做出了怎样的处理,最终都需要将数据存储起来,如何更快更好的存储数据,这就是大多数工程师需要关注的问题了。

数据库简介

应用程序如果需要保存用户的数据,一种方法是直接将数据以一定的格式存储到文件中,比如存储到 CSV 文件:

id,name,age
1,张三,20
2,李四,30
3,王五,40
4,赵六,50

CSV 格式文件可以使用 Excel 打开,自动将数据转换为表格格式,方便用户查看。

但是,对数据的操作不仅仅在于查看而已,还有增加、删除、改动...随着数据量的不断增大,会愈加发现存储到文件中的数据管理愈发复杂,这个时候,就需要使用专业的数据管理软件来帮助我们维护这些数据。

数据库软件会提供接口供应用程序操作数据,应用程序无需关心数据是如何存储到文件中的,无需关心如何增、删、改、查数据的具体细节,只需使用相应接口就行。

根据数据特点的不同,可以将数据分为『结构化数据』和『非结构化数据』:

结构化数据的特点是以行为单位,一行数据表示一个实体信息,每一行的数据属性都是相同的,因此结构化数据主要通过关系型数据库进行存储和管理。
非结构化数据的特点是数据项没有特定统一格式,数据格式常以『键值对』形式进行存储,典型的非结构化数据有办公文档、文本、图片、视频、音频等。通常将存储非结构化数据的数据库称为『非关系型数据库』。
:其实还有一种介于结构化与非结构化之间的数据,将其称之为『半结构化数据』,它不符合二维表结构化数据模型,但是它本身内容具备自描述结构,也可以像结构化数据一样将每行数据表示为一个实体信息。常见的半结构化数据有 XML 和 JSON,半结构化数据通常也采用非关系型数据库进行存储,其将数据以文档(即 XML 或 JSON 格式)的形式进行存储,因此也被称为『文档型 NoSQL』。

简而言之,依据存储数据结构的不同,可以将数据库分为『关系型数据库』和『非关系型数据库』,其中:

关系型数据库的优点是数据格式严谨、支持海量数据存储、确保数据一致性(ACID 特性)...但对于高并发场景的读写效率低(高并发下 IO 压力大),由于表间存在关系,因此在分布式场景下很难实现高扩展和高可用...
而非关系数据库却恰恰相反,它在海量数据中的并发读写效率异常出色,而且其数据存储基于键值对,数据之间没有耦合,在分布式场景下非常容易实现水平扩展...但是非关系型数据库不具备事务和数据强一致性。

需要注意的一点是,非关系型数据是对关系型数据库的一种补充,两者之间并不是对立冲突的。对数据库的选型应当考虑业务场景,比如,关系型数据库的最大优点就是事务的一致性,因此对于数据需要强一致性的场景(比如银行系统转账业务),应当选择关系型数据库。其他大多数场景,非关系型数据库可供优先选择。其实有时候甚至是需要同时结合使用关系型数据库和非关系型数据库,典型的场景比如缓存,缓存采用非关系型数据库存储,优先从缓存中获取数据,没有才到关系型数据库中进行查询。

常见的关系型数据库有:MySQL、Oracle、DB2、SQL Server、Postgre SQL 等,
非关系型数据库有 MongoDB、Redis、Memcached、HBase 等等。

本文主要介绍关系型数据库 MySQL 的一些基础用法,尽量涉及 MySQL 常用功能,可将本文作为 MySQL 使用的一个速查表(Cheat Sheet)。

:本文使用的版本为 MySQL 8.0。

相关术语

在具体讲解 MySQL 相关内容前,需要对一些概念有所了解:

安装

MySQL 支持多平台安装,传统安装方式只需下载对应平台的 MySQL Community Server 即可。如下图所示:

MySQL Community Server

具体安装过程这里就不再赘述。
:Linux 上安装 MySQL,可以直接使用发行版的包管理器,比如,Ubuntu 系统可以直接使用命令apt-get install mysql-server来安装最新版本的 MySQL。

但是本文不准备采用传统安装方式,而是采用在 Docker 中使用 MySQL。现在服务端很多采用的都是基于 Docker 的部署方式,这样可以避免环境配置等问题,简洁高效。

Docker 安装 MySQL 具体步骤如下:
:请先确保用户系统已安装 Docker,再进行后续操作。

  1. 下载 MySQL 镜像:

    $ docker pull mysql
    

    :在 Docker Hub 上搜索 mysql,可以看到有很多个版本可供选择,这里我们选择的是官方版本,即第一个mysql。但是 MySQL 官网教程使用的版本是 mysql/mysql-server,这个版本也是由 Oracle MySQL 团队维护的,该版本对 MySQL 的 Docker 镜像文件进行了一些优化。这两个版本任选其一即可,我这里由于 mysql-sever 镜像下载很慢(已设置国内源),就直接使用官方第一个版本,mysql-server 的配置方式都是差不多的,具体配置步骤可查看:附录 - Docker 安装 mysql/mysql-server

  2. 启动一个容器运行 MySQL 镜像:

    $ docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql
    

    其中:

    • --name mysql:表示容器名称为mysql
    • -p hostPort:containPost:表示端口映射,即将容器端口映射到本机系统端口,后续外部程序访问hostPort就会重定向到容器containPost中。
    • -e MYSQL_ROOT_PASSWORD=123456:表示 ROOT 用户密码为123456
    • -d:表示后台运行容器。
  3. 如果要将容器内的 MySQL 相关目录映射到本地系统,则可使用如下命令:

    $ docker run --name mysql                                       \
    -v /usr/local/docker/mysql:/etc/mysql                           \
    -v /usr/local/docker/mysql/conf:/etc/mysql/conf.d               \
    -v /usr/local/docker/mysql/logs:/var/log/mysql                  \
    -v /usr/local/docker/mysql/data:/var/lib/mysql                  \
    -v /usr/local/docker/mysql/lib/mysql-files:/var/lib/mysql-files \
    -p 3306:3306                                                    \
    -e MYSQL_ROOT_PASSWORD=123456                                   \
    -d mysql
    
    • -v <host_dir>:<container_dir>:表示将本机目录host_dir挂载到容器目录container_dir
  4. 可通过以下命令查看容器是否处于运行状态:

    $ docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
    5992f89357f0        mysql               "docker-entrypoint.s�"   5 seconds ago       Up 3 seconds        0.0.0.0:3306->3306/tcp, 33060/tcp   mysql
    
  5. 容器运行成功后,就可以进入容器:

    $ docker exec -it mysql bash
    

    :如果想为 docker bash 增加中文输入功能,可添加如下环境变量:

    $ docker exec -it mysql env LANG=C.UTF-8 bash
    
  6. 进入容器后,就可以使用容器内的 MySQL 服务了。比如,这里我们登录 MySQL:

    $ mysql -u root -p
    Enter password:
    

至此,我们连接到 Docker 内部的 MySQL 服务端,现在我们就可以对 MySQL 进行操作了。

:如果是在 Windows 子系统(即 wsl2)中使用 MySQL,可能会出现以下错误:

Error: Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’ (2)

这是因为 MySQL 后台服务未启动,此时通过以下命令即可启动服务,然后就可以登录 MySQL:

$ sudo /etc/init.d/mysql start

如果上述操作后仍然出现上述错误,则可以等待一会,直到创建了mysqld.sock(wsl2 中执行到这一步速度有时很慢),可通过日志查询启动过程:

$ docker logs -f mysql
...
2020-10-15T15:48:30.166060Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.21'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server - GPL.

更多详细信息,可参考文章:Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’ (2) in Linux Subsystem for Windows 10

编码规范

在对数据库进行操作前,有必要了解下数据库操作的一些编码规范,大致有如下:

更多 MySQL 数据库编码规范,可参考:MySQL学习笔记-数据库设计规范

数据库基本操作

在安装完 MySQL 后,就可以对数据库进行操作了。首先介绍下 MySQL 中对数据库的基本操作。

:后文中介绍到的任何 SQL 命令,都可以直接在 MySQL 命令行中通过help命令查看其具体信息。比如,我们想查看CREATE DATABASE命令,只需输入如下内容:

mysql> help CREATE DATABASE;
Name: 'CREATE DATABASE'
Description:
Syntax:
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
    [create_option] ...

create_option: [DEFAULT] {
    CHARACTER SET [=] charset_name
  | COLLATE [=] collation_name
}

CREATE DATABASE creates a database with the given name. To use this
statement, you need the CREATE privilege for the database. CREATE
SCHEMA is a synonym for CREATE DATABASE.

# 甚至附带了官方文档链接
URL: https://dev.mysql.com/doc/refman/5.7/en/create-database.html

字段数据类型

在介绍 MySQL 表具体操作前,有必要先了解一下 MySQL 支持的字段数据类型。因为表创建的一个重要内容就是确定字段类型。

MySQL 字段支持多种数据类型,主要可分为三大类:『数值类型』,『日期和时间类型』和『字符串类型』,具体内容如下:

数据表基本操作

创建完数据库后,就可以在该数据库内进行数据表创建,让表作为某些实体数据的载体。

对数据表的基本操作,包含如下内容:

上一篇 下一篇

猜你喜欢

热点阅读