一、数据库概述
- 数据库就是一个运行在系统上的软件,用于存储用户个人信息、用户的游戏资料等;
- 数据库是多个表的集合,是存储数据的仓库,以一定的组织方式存储的相互有关的数据
- 数据库由多个表组成,多个数据记录组成一张表,类似Excel
- 数据库结构:由多个库组成,一个库包含多个表,一个表包含多条数据记录(如文字、声音、图形)
二、数据库分类
- 关系型数据库:建立在关系代数理论基础上,数据结构使用简单易懂的二维数据表,
可以用简单的“实体-关系”(E-R)图表示;E-R图中包含实体(数据对象)、关系和属性三个要素 - 非关系型数据库:也称为NoSQL(Not Only SQL),存储数据不以关系模型为依据,不需要固定的表格式
三、常见数据库产品
- Oracle:不开源的关系型数据库。oracle产品,很好的支持TB级的数据、运行稳定、功能齐全、性能优异,安全机制好、价格昂贵,跨平台支持。大型企业使用
- DB2:不开源的关系型数据库。IBM产品,最适用于海量数据,能满足中大型企业的需求,也可以用于小中型电子商务系统,具有较好的可伸缩性、安全性和跨平台支持
- SQLServer:不开源的关系型数据库。Microsoft产品,功能全面的数据库,只支持Microsoft操作系统。用于中大型企业,与其他数据库相比,在操作性和交互性上有很大的优势
- PostgreSQL:最具特色的开源数据库,免费。有最全的数据类型支持,PostgreSQL支持大部分SQL标准并且提供了许多其他现代特性:复杂查询、外键、触发器、视图、事务完整性、MVCC。可以使用多种方法扩展,如增加新的数据类型、函数、操作符、聚集函数、索引
- MySQL:开源的关系型数据库。由瑞典MySQL AB公司开发,目前被oracle公司收购,有体积小、速度快、性能出色、跨平台支持、成本低廉、简单易学、使用灵活等特性,很多中小型网站会选择使用MySQL作为数据库
- MariaDB:MySQL在 008年被Sun以10亿美金所收购,MySQL 创始人 Michael Widenius 则不满Sun开发团队脚步过慢,愤而离职成立开源数据库联盟,另外从现有 MySQL程序代码中,开发出另一个延伸分支版本,也就是名为玛莉亚数据库的企业级开源数据库。
玛莉亚数据库如同 MySQL 的影子版本,玛莉亚数据库是MySQL 的一个分支版本(branch),而不是衍生版本(folk),提供的功能可和 MySQL 完全兼容。 - NoSQL:NoSQL(NoSQL = Not Only SQL),意即“不仅仅是SQL”,是一项全新的数据库革命性运动。NoSQL指的是非关系型的数据库。随着互联网 web2.0网站的兴起,传统的关系数据库在应付web2.0 网站,特别是超大规模和高并发的 SNS 类型的 web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。
其代表的开源软件如:Membase、MongoDB、Hypertable、Apache Cassandra、CouchDB等。
四、MySQL概述
- MySQL是一个开源的关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于Oracle旗下产品。MySQL
是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS(Relational Database
Management System,关系数据库管理系统) 应用软件。 - MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
- MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择MySQL 作为网站数据库。
- 由于其社区版的性能卓越,搭配PHP和Apache可组成良好的开发环境。
五、MySQL特性
1.使用 C和 C++编写,并使用了多种编译器进行测试,保证了源代码的可移植性。
2.支持 AIX、FreeBSD、HP-UX、Linux、Mac OS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris、Windows等多种操作系统。
3.为多种编程语言提供了 API。这些编程语言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby,.NET和 Tcl 等。
4.支持多线程,充分利用 CPU 资源。
5.优化的 SQL查询算法,有效地提高查询速度。
6.既能够作为一个单独的应用程序应用在客户端服务器网络环境中,也能够作为一个库而嵌入到其他的软件中。
7.提供多语言支持,常见的编码如中文的 GB 2312、BIG5,日文的 Shift_JIS等都可以用作数据表名和数据列名。
8.提供 TCP/IP、ODBC 和 JDBC等多种数据库连接途径。
9.提供用于管理、检查、优化数据库操作的管理工具。
10.支持大型的数据库。可以处理拥有上千万条记录的大型数据库。
11.支持多种存储引擎。
12.MySQL 是开源的,所以你不需要支付额外的费用。
13.MySQL 使用标准的 SQL数据语言形式。
14.MySQL 对 PHP 有很好的支持,PHP是比较流行的 Web 开发语言。
15.MySQL是可以定制的,采用了 GPL协议,你可以修改源码来开发自己的 MySQL 系统。
16.在线 DDL/更改功能,数据架构支持动态应用程序和开发人员灵活性(5.6新增)
17.复制全局事务标识,可支持自我修复式集群(5.6新增)
18.复制无崩溃从机,可提高可用性(5.6新增)
19.复制多线程从机,可提高性能(5.6新增)
20.3倍更快的性能(5.7 新增)
21.新的优化器(5.7新增)
22.原生JSON支持(5.7新增)
23.多源复制(5.7新增)
24.GIS的空间扩展 (5.7新增)
六、MySQL存储引擎
一种存储机制、根据不同的引擎实现不同的功能,以及不同的性能
1.存储引擎分类
- MyISAM:MySQL 5.0之前的默认数据库引擎,最为常用。拥有较高的插入,查询速度,但不支持事务。表级锁定:数据更新时会锁定整张表。占用资源少,性能高。写入性能弱
- InnoDB:事务型数据库的首选引擎,支持ACID事务,支持行级锁定, MySQL 5.5起成为默认数据库引擎。与MyISAM相比有更好的缓存支持,支持表空间、表分区、占用硬件资源较高。
- BDB:源自 Berkeley DB,事务型数据库的另一种选择,支持Commit 和Rollback 等其他事务特性
- Memory:所有数据置于内存的存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。并且其内容会在 MySQL重新启动时丢失
- Merge:将一定数量的 MyISAM 表联合而成一个整体,在超大规模数据存储时很有用
- Archive:非常适合存储大量的独立的,作为历史记录的数据。因为它们不经常被读取。Archive拥有高效的插入速度,但其对查询的支持相对较差
- Federated:将不同的 MySQL 服务器联合起来,逻辑上组成一个完整的数据库。非常适合分布式应用
- Cluster/NDB:高冗余的存储引擎,用多台数据机器联合提供服务以提高整体性能和安全性。适合数据量大,安全和性能要求高的应用
- CSV: 逻辑上由逗号分割数据的存储引擎。它会在数据库子目录里为每个数据表创建一个 .csv
文件。这是一种普通文本文件,每个数据行占用一个文本行。CSV 存储引擎不支持索引。 - BlackHole:黑洞引擎,写入的任何数据都会消失,一般用于记录 binlog 做复制的中继
- EXAMPLE 存储引擎是一个不做任何事情的存根引擎。它的目的是作为 MySQL
源代码中的一个例子,用来演示如何开始编写一个新存储引擎。同样,它的主要兴趣是对开发者。EXAMPLE 存储引擎不支持编索引。
另外,MySQL 的存储引擎接口定义良好。有兴趣的开发者可以通过阅读文档编写自己的存储引擎 。
2.引擎操作
(1)查看
mysql> show engines; //查看当前数据库所有支持的存储引擎 mysql> show table status from 库名 where name='表名'\G; //查看指定表的状态信息,可查看表使用的存储引擎 mysql> show create table 表名\G; //查看创建表时的结构,也可查看表创建时指定的存储引擎
(2)更改
(2.1)更改默认存储引擎(下次创建表时生效,以前表存储引擎不会更改)
vim /etc/my.cnf [mysqld] default-storage-engine=引擎 /etc/init.d/mysqld restart mysql -u root -p mysql> show engines; //验证是否更改
(2.2)更改现有表的存储引擎
mysql> alter table 表名 engine=引擎; //将指定表更改为指定的存储引擎
(2.3)创建表时指定存储引擎
mysql> create table 表名 字段 engine=引擎; //创建使用指定引擎的表
(2.4)批量将指定库下所有表的InnoDB改为MyISAM
yum -y install perl-DBD-MySQL //安装命令所需的软件包 mysql_convert_table_format --user=用户名 --password='密码' --socket=/tmp/mysql.sock --type=MyISAM 数据库名 //更改指定库下的所有表的存储引擎;适用于源码 mysql_convert_table_format --user=用户名 --password='密码' --socket=/var/lib/mysql/mysql.sock --type=MyISAM 数据库名 //更改指定库下的所有表的存储引擎;适用于RPM或YUM
注:mysql_convert_table_format命令只能从InnoDB引擎更改为MyISAM
七、MySQL索引功能
1.索引的作用
- 大大大加快数据的检索速度和增加查询的效率
- 降低磁盘I/O成本
- 保证数据记录的唯一性
- 使得应用于表的SQL语句执行的更快
2.索引简述
- 在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
- 索引是一种特殊的文件(InnoDB
数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。索引不是万能的,索引可以加快数据检索操作,但会使数据修改操作变慢。每修改数据记录,索引就必须刷新一次。为了在某种程度上弥补这一缺陷,许多SQL 命令都有一个 DELAY_KEY_WRITE 项。这个选项的作用是暂时制止 MySQL在该命令每插入一条新记录和每修改一条现有之后立刻对索引进行刷新,对索引的刷新将等到全部记录插入/修改完毕之后再进行。在需要把许多新记录插入某个数据表的场合,DELAY_KEY_WRITE选项的作用将非常明显。另外,索引还会在硬盘上占用相当大的空间。因此应该只为最经常查询和最经常排序的数据列建立索引。注意,如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果。 - 从理论上讲,完全可以为数据表里的每个字段分别建一个索引,但 MySQL 把同一个数据表里的索引总数限制为16个。
InnoDB 数据表的索引
- 在 InnoDB 数据表上,索引对 InnoDB 数据表的重要性要大得多。在 InnoDB数据表上,索引不仅会在搜索数据记录时发挥作用,还是数据行级锁定机制的苊、基础。“数据行级锁定”的意思是指在事务操作的执行过程中锁定正在被处理的个别记录,不让其他用户进行访问。这种锁定将影响到(但不限于)SELECT、LOCKINSHAREMODE、SELECT、FORUPDATE命令以及 INSERT、UPDATE 和 DELETE 命令。出于效率方面的考虑,InnoDB数据表的数据行级锁定实际发生在它们的索引上,而不是数据表自身上。显然,数据行级锁定机制只有在有关的数据表有一个合适的索引可供锁定的时候才能发挥效力。
3.索引的限制
- 如果 WHERE 子句的查询条件里有不等号(WHERE coloum !=),MySQL 将无法使用索引。类似地,如果 WHERE子句的查询条件里使用了函数(WHERE DAY(column)=),MySQL 也将无法使用索引。在 JOIN操作中(需要从多个数据表提取数据时),MySQL 只有在主键和外键的数据类型相同时才能使用索引。
- 如果 WHERE 子句的查询条件里使用比较操作符 LIKE 和 REGEXP,MySQL只有在搜索模板的第一个字符不是通配符的情况下才能使用索引。比如说,如果查询条件是 LIKE 'abc%‘,MySQL将使用索引;如果查询条件是 LIKE '%abc’,MySQL 将不使用索引。
- 在 ORDER BY 操作中,MySQL只有在排序条件不是一个查询条件表达式的情况下才使用索引。(虽然如此,在涉及多个数据表查询里,即使有索引可用,那些索引在加快 ORDERBY 方面也没什么作用)。如果某个数据列里包含许多重复的值,就算为它建立了索引也不会有很好的效果。比如说,如果某个数据列里包含的净是些诸如“0/1” 或 “Y/N” 等值,就没有必要为它创建一个索引。
4.索引的分类
(1)普通索引
- 最基本的索引类型,没有唯一性之类的限制。
(2)唯一索引
- 唯一索引是不允许其中任何两行具有相同索引值的索引。
- 当现有数据中存在重复的键值时,大多数数据库不允许将新创建的唯一索引与表一起保存。数据库还可能防止添加将在表中创建重复键值的新数据。例如,如果在employee 表中职员的姓 (lname) 上创建了唯一索引,则任何两个员工都不能同姓。
- 对某个列建立UNIQUE索引后,插入新纪录时,数据库管理系统会自动检查新纪录在该列上是否取了重复值,在CREATE TABLE命令中的UNIQE约束将隐式创建UNIQUE索引。
(3)主键索引
- 简称为主索引,数据库表中一列或列组合(字段)的值唯一标识表中的每一行。该列称为表的主键。
- 在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。该索引要求主键中的每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问。
- 提示尽管唯一索引有助于定位信息,但为获得最佳性能结果,建议改用主键索引。
(4)候选索引
- 与主索引一样要求字段值的唯一性,并决定了处理记录的顺序。在数据库和自由表中,可以为每个表建立多个候选索引。
(5)复合索引
- 两个或更多个列上的索引被称作复合索引。 利用索引中的附加列,您可以缩小搜索的范围,但使用一个具有两列的索引不同于使用两个单独的索引。不允许数据记录出现重复值和空值。
(6)全文索引
- 全文索引是目前实现大数据搜索的关键技术。能够利用分词技术等多种算法智能分析出文本文字中关键字词的频率及重要性,然后按照一定的算法规则智能地筛选出我们想要的搜索结果。用于多个列值,允许数据记录出现重复值和空值
- MySQL自带的全文索引只能用于数据库引擎为MyISAM的数据表
(7)空间索引
- 在MySQL 5.7.4实验室版本中,
InnoDB存储引擎新增了对于几何数据空间索引的支持。在此之前,InnoDB将几何数据存储为BLOB(二进制大对象)数据,在空间数据上只能创建前缀索引,当涉及空间搜索时非常低效,尤其是在涉及复杂的几何数据时。在大多数情况下,获得结果的唯一方式是扫描表。
新版本MySQL中,InnoDB支持空间索引,通过R树来实现,使得空间搜索变得高效。
5.索引的使用
(1)创建索引
create [unique | fulltext | spatial] index 索引名 on 表名(字段)
详解
unique:唯一索引
fulltext:全文索引,InnoDB不支持FULLTEXT类型的索引
spatial:空间索引
案例
mysql> create index hehe_1 on hehe.user(user_name); //user表中user_name字段新建普通索引
mysql> create unique index hehe_2 on hehe.user(user_passwd); //user表中user_passwd字段新建唯一索引
mysql> create index hehe_3 on hehe.user(user_name,user_passwd);
//user表中user_name、user_passwd字段组合为复合索引
(2)查看索引
show index from 数据库名.表名;
(3)删除索引
drop index 索引名 on 数据库名.表名;
八、MySQL事务功能
1.事务简述
一个事务是一个连续的一组数据库操作,就好像它是一个单一的工作单元进行。换言之,永远不会是完整的事务,除非该组内的每个单独的操作是成功的。如果在事务的任何操作失败,则整个事务将失败。
2.事务特性
- 原子性:在事务的操纵中,要么都执行、要么都不执行
- 一致性:事务中,保证数据从一个一致状态变为另一一致状态
- 隔离性:每个事务互不干扰,一起执行也可
- 持久性:事务提交后,数据的影响是永久性的
3.事务使用
(1)自动提交
mysql> set autocommit=1; //开启事务自动提交,set autocommit=0禁止自动提交
(2)手动提交
mysql> begin; //事务开始声明 mysql> SQL语句...; //执行的SQL语句 mysql> rollback; //回滚事务 mysql> commit; //提交事务
注:回滚只能回滚当前事务提交之前操纵,所有当前事务提交成功的全部失效
(3)自动回滚的情况
- begin后手动退出数据库(如Ctrl+C、quit、exit)
- 服务器断电
(4)例子:转账
1.给对方转账1000,帐号不对
2.输入转入金额
3.提交确认
begin;
create database hehe;
create table hehe.a(number int,user char(4),menony int(4));
insert into hehe.a values ('1','a','1000');
insert into hehe.a values ('2','b','10');
commit; //正常提交
事务操作
begin; //开始
update hehe.a set menony='0' where user='a';
rollback; //回滚操作
begin;
update hehe.a set menony='0' where user='a';
update hehe.a set menony='1010' where user='b';
commit; //提交
rollback; //由于系统已经提交,故不能撤销,
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。