平时我们大家看到的各种网站、网页,其实里面最底层的内容基本上都来自于数据库。首先我们看到的Web页面上的图文内容都来自于服务器,而服务器的内容就来自于数据库。
当你打开网易云听音乐时,播放列表是从数据库中读取出来的。
当你拍摄精美的照片上传社交平台时,你的照片库就有可能存储在一个数据库中。
当你用淘宝、京东购物时,你使用购物车就是数据库应用。
DB数据库(database):存储数据的“仓库”。它保存了一系列有组织的数据。
DBMS数据库管理系统(Database Management System):数据库是通过DBMS创建和操作的容器。
SQL,结构化查询语言(Structured Query Language)用一句话概括,SQL是一种特殊目的的编程语言,一种专门用来与数据库通信的语言。在数据库中,数据被结构化并存储在不同的表中,从而简化了访问,更新和操作数据的过程。该表由列和行组成。数据库中的表可以在关系的帮助下进行连接。要在数据库中执行与数据相关的任务,可以使用SQL。SQL代表结构化查询语言,旨在在特定RDBMS内创建,修改和管理数据库中的数据。三者的关系:当你有一堆文件需要整理的时候,你就会想要配备一个资料管理员,让他来整理这些文件,把它放进文件柜。那这个时候相当于是资料管理员在管理文件。资料管理员就相当于DBMS,文件柜就相当于DB,而你需要用资料管理员能听得懂的语言来描述你的需求,这个语言就是SQL。
常用关系型数据库产品介绍
oracle数据库
Oracle前身叫SDL、由Larry Ellison和两个变成任意在1977创办,他们开发了主机的拳头产品,在市场上大量销售。Oracle公司是最早开发关系型数据库的厂商之一,其产品支持最广泛的操作系统平台。目前Oracle关系数据库产品的市场占有率数一数二 。
Oracle公司是目前全球最大的数据库软件公司,也是近年业务增长极为迅速的软件提供与服务商
主要应用范围:传统大企业、大公司、政府、金融、证券等。
MariaDB数据库
MAriaDB数据库管理系统是MySQL数据库的一个分支,主要由开元社区维护,采用GPL授权许可。开发这个MariaDB的原因之一是:甲骨文公司收购了MySQL后,有MySQL闭源的潜在风险,因此MySQL开元社区采用分支的方式来避开这个风险。 MariaDB基于事务的Maria存储引擎,替换了MySQL的MyISAM的存储引擎,它使用了Percona的XtraDB(InnoDB的变体)这个版本还包括了PrimeBase XT (PBXT)和Federated X存储引擎。
Access数据库
Access是入门级小型桌面数据库,性能安全性都很一般,可供个人管理或小型企业用。 Access不是数据库语言,只是一个数据库程序,目前最新版本为Office 2021,其特点主要如下:
(1)完善地管理各种数据库对象,具有强大的数据组织,用户管理、安全检查等功能
(2)强大的数据处理功能,在一个工作组级别的网络环境中,使用Access开发的多用户管理系统具有传统的XSASE(DBASE、FoxBASE的统称)数据库系统所无法实现的客户服务器(Ckient/Server)结构和响应的数据库安全机制,Access具备了许多先进的大型数据管理管理系统所具备的特征。
(3)可以方便地生成各种数据对象,利用存储的数据建立窗体和报表
(4)作为Office套件的一部分,可以与Office集成,实现无缝连接
(5)能够利用Web检索和发布数据,实现与Internet的连接,Access主要适用于中小企业应用系统,或作为客户机/服务器系统中的客户端数据库。
SQL Server数据库
Microsoft SQL Server是微软公司开发的大型关系数据库系统。SQL Server的功能比较全面,效率高,可以作为中型企业或单位的数据库平台。SQL Server可以与Winodws操作系统紧密集成,不论是应用程序开发速度还是系统事务处理运行速度,都得到较大的提升,对于在Windows平台上开发的各种企业级信息管理系统来说,不论是C/S(客户机/服务器)架构还是B/S(浏览器/服务器)架构。SQL Server都是一个很好的选择。SQL Server的缺点是只能在Windows系统下运行。
MySQL
MySQL是数据库管理系统中的一种,是市面上最流行的数据库管理软件之一。MySQL被广泛的应用在Internet上的大中小型网站中。由于体积小、速度快、总体拥有成本低,开放源代码。MySQL是一种关系型数据库管理系统,关系型数据库的特点是将数据保存在不同的表中,在将这些表放入不同的数据库中,而不是将所有数据统一放在一个大仓库里,这样的设计增加了MySQL的读取速度,灵活性和可管理型也得到了很大提高,访问以及管理MySQL数据库的最常用标准化语言为SQL结构化查询语句。
MySQL数据库四种发布版本介绍
(1)Alpha版
Alpha版一般只在开发的公司内部运行,不对外公开
(2)Beta版
Beta版一般是完成功能的开发与所有的测试工作之后的产品,不会存在较大的功能或性能BUG,并且邀请或提供给用户体验与测试,以便更全面地测试软件的问题。
(3)RC版
RC版属于生产环境发布之前的一个小版本或称候选版,是根据Beta版本测试结果,收集到的BUG或缺陷之处等收集到的信息,进行修复和完善之后的一版产品
(4)GA版 (GA:General Availability)
GA版是软件产品正式发布的版本,也称生产版本的产品
MySQL优势:(1) MySQL性能卓越、服务稳定,很少出现异常宕机
(2) MySQL开放源代码且无版权制约,自主性及使用成本低
(3) MySQL历史悠久,社区及用户活跃,遇到问题可以解决
(4) MySQL软件体积小,安装使用简单,并且易于文虎,安装及维护成本低
(5) MySQL品牌口碑效应,使得企业无需考虑就直接用,LAMP、LEMP流行架构
(6) MySQL支持多用操作系统,提供多种API接口,支持多用开发语言,特别对流行的PHP语言有很好的支持
为了更好地推广MySQL Cluster版本,以及提高MySQL Cluster的性能和稳定性,以及功能改进和增加,以及改动MySQL基础功能,使其对Cluster存储引擎提供更有效的支持与优化。版本号为6.0.xx开发。目前发展到8.0.xx
官方地址提供数据库下载版本:http://dev.mysql.com/downloads/mysql
现在国内的镜像站也支持下载:http://mirrors.sohu.com/mysql/
MySQL数据库软件命名介绍
MySQL数据库软件的名字是由3个数字和一个后缀组成的版本号。
例如,像mysql-8.0.16-el7-x86_64.tar.gz的版本号解释:
(1) 第1个数字(8)是主版本号,描述了文件格式。所有版本5发行都有相同文件格式
(2) 第2个数字(0)是发行级别。主版本号和发行级别组合到一起便构成了发行序列号。
(3) 第3个数字(16)是在此系列的版本号,随每个新分发递增,通常你需要选择已经发行(release)的最新版本
(4) 后缀显示发行的稳定级别,通过一系列后缀显示如何改进稳定性,可能的后缀有:*alpha版
MySQL数据库安装
官方下载地址:https://dev.mysql.com/downloads/mysql/
rpm包安装
由于RHEL7以后安装光盘不再提供MySQL,可以将所有的RPM包下载下来安装,也可以配置官方提供的yum源文件
https://dev.mysql.com/downloads/repo/yum/
yum源安装(不推荐)
在CentOS 7中默认有安装MariaDB,这个是mysql的分支,一般使用自己安装的MySQL比较好
卸载mariadb:yum erase -y mariadb-libs-5.5.68-1.el7.x86_64
1、下载并安装MySQL
下载仓库包
wget -i -c https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
安装仓库
rpm -ivh mysql80-community-release-el7-1.noarch.rpm
或 yum -y install mysql80-community-release-el7-3.noarch.rpm
安装mysql 8.0版
yum install -y mysql-community-{server,client,common,libs}-*
安装完成后,之前的MariaDB就会被覆盖掉
rpm包安装(推荐)
该方法安装时,虽然安装包以及下载到了本地,但是在安装的过程中仍然可能会存在一些依赖,因此需要修改网络源来安装。(使用网络yum源,不能使用本地yum源)
网易163 yum源:http://mirrors.163.com/.help
搜狐yum源:http://mirrors.sohu.com
阿里云yum源:http://mirrors.aliyun.com/repo/
清华大学 yum源:http://mirrors.tuna.tsinghua.edu.cn/
浙江大学yum源:http://mirrors.zju.edu.cn
中国科技大学 yum源:http://centos.ustc.edu.cn
卸载mariadb
rpm -e postfix-2:2.10.1-9.el7.x86_64
rpm -e mariadb-libs-5.5.68-1.el7.x86_64
1、rpm安装MySQL
tar xf mysql-8.0.16-2.el7.x86_64.rpm-bundle.tar -C /opt/
cd /opt
yum localinstall *
2.启动mysql 8.0服务
systemctl start mysqld
systemctl enable mysqld
查看MySQL是不是开机自启,可以执行命令查看开机自启列表
systemctl list-unit-files|grep mysqld
3.登录数据库
此时如果要进入MySQL得找出root用户的密码,输入命令
grep “password” /var/log/mysqld.log
得到密码后,登录mysql,输入命令
mysql -uroot -p
grep “password” /var/log/mysqld.log
此时,你需要给你的MySql重新设置密码,因为MySQL默认的就是必须修改密码后才能操作数据库。
mysql> alter user ‘root’@‘localhost’ identified by ‘(自己设定的密码)’;
设置密码的时候需要遵守MySQL密码设置规范,如果不符合规范是不能修改成功的。
查看密码规范:SHOW VARIABLES LIKE ‘validate_password%’;
Mysql命令行基本操作
1、查看数据库
使用SHOW DATABASES或者SHOW SCHEMAS命令查看所有的数据库/模式
2、显示某个数据库中的表
use databasename;
show tables;
查看单表的创建信息
show create table t1;
3、创建数据库
create database 库名;
例如:创建一个名字为test的库
mysql> create database test;
4、建表
use 库名;
create table 表名 (字段设定列表);
例如:在刚创建的aaa库中建立表name,表中有id(序号,自动增长),name(姓名),sex(性别),birth(出身年月)
四个字段
use test;
mysql> create table name (id int(3) auto_increment not null primary key, xm char(8),xb char(2),csny date);
可以用describe命令察看刚建立的表结构
5、显示数据表的结构
describe tablename;
6、增加记录
例如:增加几条相关记录。
mysql> insert into name values(NULL,’黑土’,’男’,’1971-10-01’);
mysql> insert into name values(NULL,‘白云’,‘女’,‘1972-05-20’);
可用select命令来验证结果。
mysql> select * from name;
7、修改记录
例如:将jack的出生年月改为1971-01-10
mysql> update name set birth=‘1971-01-10’ where name=‘jacl’;
8、删除记录
例如:删除黑土的记录。
mysql> delete from name where xm=’黑土’;
9、修改表
alter table t1 modify name char(3);
10、删库和删表
drop database 库名;
drop table 表名;
11、备份
例如:将上例创建的aaa库备份到文件back_aaa中
cd /home/data/mysql (进入到库目录)
mysqldump -u root -p --opt aaa > back_aaa 或者 mysqldump -u root -p aaa > back_aaa
12、恢复
mysql -u root -p ccc < back_aaa
MySQL备份
恢复
MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。但是过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。建立索引会占用磁盘空间的索引文件。
MySQL中的索引分类
PRIMARY, INDEX, UNIQUE 这3种是一类
PRIMARY 主键。 就是 唯一 且 不能为空。
INDEX 索引,普通的。值可以为空,没有唯一性的限制。
UNIQUE 唯一索引。 不允许有重复,值可以为空。
FULLTEXT 是全文索引,用于在一篇文章中,检索文本信息的。
索引:
创建索引
创建视图
语法一:create view 视图名 (列名1, 列名2, …) AS 子查询 with check option
语法二:create view 视图名 as select语句
查看视图
show tables; 查看视图名
show table status 查看详细信息
show create view 查看视图定义信息
decsribe desc view_user;查看视图结构
修改视图
方法一:删除后创建
方法二:alter 修改视图
alter view 视图名 as select语句;
删除视图
drop view 视图名 [cascade]
通过视图操作基表
查询数据
对视图的查询完全可以当初对数据表的查询。因为视图是一个虚拟表。
更新数据
更新视图是指通过视图来插入(NSERT)、删除(DELETE)和修改(UPDATE)数据。由于视图是不实际存储数据的虚表,因此对视图的更新最终要转换为对基本表的更新。像查询视图那样,对视图的更新操作也是通过视图消解,转换为对基本表的更新操作。
为防止用户通过视图对数据进行增加、删除、修改时,有意无意地对不属于视图范围内的基本表数据进行操作,可在定义视图时加上WITH CHECK OPTION子句。这样在视图上增、删、改数据时,关系数据库管理系统会检查视图定义中的条件,若不满足条件则拒绝执行该操作。
MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务。
在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
事务用来管理 insert,update,delete 语句
一般来说,事务是必须满足4个条件(ACID):原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。
原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
在mysql中,事务是一种机制、一个操作序列,是访问和更新数据库的程序执行单元。事务中包含一个或多个数据库操作命令,会把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行。
在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作。因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION,或者执行命令 SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交。
SET AUTOCOMMIT=0 禁止自动提交
SET AUTOCOMMIT=1 开启自动提交
查看MySQL数据库使用的引擎:SHOW ENGINES;
MySQL常用数据库引擎
MyIASM 和 Innodb引擎详解
Innodb引擎
Innodb引擎提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级别。
该引擎还提供了行级锁和外键约束,它的设计目标是处理大容量数据库系统,它本身其实就是基于MySQL后台的完整数据库系统,MySQL运行时Innodb会在内存中建立缓冲池,用于缓冲数据和索引。
但是该引擎不支持FULLTEXT类型的索引,而且它没有保存表的行数,当SELECT COUNT(*) FROM TABLE时需要扫描全表。当需要使用数据库事务时,该引擎当然是首选。
由于锁的粒度更小,写操作不会锁定全表,所以在并发较高时,使用Innodb引擎会提升效率。但是使用行级锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表。
MyIASM引擎
MyIASM是MySQL(5.5之前)默认的引擎,但是它没有提供对数据库事务的支持,也不支持行级锁和外键,因此当INSERT(插入)或UPDATE(更新)数据时即写操作需要锁定整个表,效率便会低一些。
不过和Innodb不同,MyIASM中存储了表的行数,于是SELECT COUNT(*) FROM TABLE时只需要直接读取已经保存好的值而不需要进行全表扫描。
如果表的读操作远远多于写操作且不需要数据库事务的支持,那么MyIASM也是很好的选择。
两种引擎的选择:
大尺寸的数据集趋向于选择InnoDB引擎,因为它支持事务处理和故障恢复。
数据库的大小决定了故障恢复的时间长短,InnoDB可以利用事务日志进行数据恢复,这会比较快。
主键查询在InnoDB引擎下也会相当快,不过需要注意的是如果主键太长也会导致性能问题。
大批的INSERT语句(在每个INSERT语句中写入多行,批量插入)在MyISAM下会快一些,但是UPDATE语句在InnoDB下则会更快一些,尤其是在并发量大的时候。
不同的存储引擎都有各自的特点,以适应不同的需求,如下表所示:
MyISAM和InnoDB的区别是什么(面试常问)
主要有以下区别:
1、MySQL默认采用的是MyISAM。(MySQL5.5之前,默认引擎是“MyISAM”;从MySQL5.5版本开始,默认引擎是“InnoDB”)
2、MyISAM不支持事务,而InnoDB支持。InnoDB的AUTOCOMMIT默认是打开的,即每条SQL语句会默认被封装成一个事务,自动提交,这样会影响速度,所以最好是把多条SQL语句显示放在begin和commit之间,组成一个事务去提交。
3、InnoDB支持数据行锁定,MyISAM不支持行锁定,只支持锁定整个表。即MyISAM同一个表上的读锁和写锁是互斥的,MyISAM并发读写时如果等待队列中既有读请求又有写请求,默认写请求的优先级高,即使读请求先到,所以MyISAM不适合于有大量查询和修改并存的情况,那样查询进程会长时间阻塞。因为MyISAM是锁表,所以某项读操作比较耗时会使其他写进程饿死。
4、InnoDB支持外键,MyISAM不支持。
5、InnoDB的主键范围更大,最大是MyISAM的2倍。
6、InnoDB不支持全文索引,而MyISAM支持。全文索引是指对char、varchar和text中的每个词(停用词除外)建立倒排序索引。MyISAM的全文索引其实没啥用,因为它不支持中文分词,必须由使用者分词后加入空格再写到数据表里,而且少于4个汉字的词会和停用词一样被忽略掉。
7、MyISAM支持GIS数据,InnoDB不支持。即MyISAM支持以下空间数据对象:Point,Line,Polygon,Surface等。
【补充】
MySQL表级锁和行级锁
表级,直接锁定整张表,在你锁定期间,其它进程无法对该表进行写操作。如果你是写锁,则其它进程连读也不允许
行级, 仅对指定的记录进行加锁,这样其它进程还是可以对同一个表中的其它记录进行操作。
相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);InnoDB存储引擎既支持行级锁( row-level locking),也支持表级锁,但默认情况下是采用行级锁。
MySQL主要的两种锁的特性可大致归纳如下:
表级锁: 开销小,加锁快;不会出现死锁(因为MyISAM会一次性获得SQL所需的全部锁);锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁: 开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
考虑上述特点,表级锁适用于并发性不高,以查询为主,少量更新的应用,比如小型的web应用;而行级锁适用于高并发环境下,对事务完整性要求较高的系统,如在线事务处理系统。