MySQL(1)介绍
MySQL

MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。
介绍Mysql 之前先介绍一下什么是数据库。
什么是数据库?
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。
每个数据库都有一个或多个不同的 API 用于创建,访问,管理,搜索和复制所保存的数据。
我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。
所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理的大数据量。所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
RDBMS 即关系数据库管理系统(Relational Database Management System)的特点:
- 1.数据以表格的形式出现
- 2.每行为各种记录名称
- 3.每列为记录名称所对应的数据域
- 4.许多的行和列组成一张表单
- 5.若干的表单组成database
非关系型数据库主要是基于“非关系模型”的数据库(由于关系型太大,所以一般用“非关系型”来表示其他类型的数据库)
- 列模型:存储的数据是一列列的。关系型数据库以一行作为一个记录,列模型数据库以一列为一个记录。(这种模型,数据即索引,IO很快,主要是一些分布式数据库)
- 键值对模型:存储的数据是一个个“键值对”,比如name:liming,那么name这个键里面存的值就是liming
- 文档类模型:以一个个文档来存储数据,有点类似“键值对”。
-
常见非关系模型数据库:
- 列模型:Hbase
- 键值对模型:redis,MemcacheDB
- 文档类模型:mongoDB
数据库管理软件分类
分两类
关系型(SQL):如sqllite,db2,oracle,access,sql server,MySQL,注意:sql语句通用
非关系型(NoSQL):mongodb,redis,memcache
SQL与NoSQL(关系型与非关系型)数据库的区别
关系型和非关系型数据库的主要差异是数据存储的方式。关系型数据天然就是表格式的,因此存储在数据表的行和列中。
数据表可以彼此关联协作存储,也很容易提取数据。与其相反,非关系型数据不适合存储在数据表的行和列中,而是大块组合在一起。非关系型数据通常存储在数据集中,
就像文档、键值对或者图结构。你的数据及其特性是选择数据存储和提取方式的首要影响因素。
预定义结构VS.动态结构
关系型数据通常对应于结构化数据,因为数据表都有预定义好的结构(列的定义),结构描述了数据的形式和内容。这一点对数据建模至关重要,你必须“第一时间先把结构定义好”。虽然预定义结构带来了可靠性和稳定性,但是已经存入数据的表结构要修改就非常痛苦了。另一方面,非关系型数据基于动态结构,通常适用于非结构化数据。非关系型数据可以很容易适应数据类型和结构的变化,因为动态结构本身就支持这一点。
存储规范化VS存储代价
关系型数据库的数据存储是为了更高的规范性,把数据分隔成最小的逻辑表(关系表)以避免重复,获得最精简的空间利用。虽然数据规范性会使数据管理更清晰,但它通常也会带来一点点复杂性,尤其是单个操作可能涉及多个关系表的时候,数据管理就有点麻烦。另外,更精简的空间利用通常可以节约宝贵的数据存储,但是在当今世界我们基本可以认为存储的代价(磁盘空间)是微不足道的。而非关系型数据存储在平面数据集中,数据经常可能存在重复。单个数据库很少被分隔开,而是存储成一个整体,这样是为了整块数据更容易读写。
纵向扩容VS横向扩容
SQL和NoSQL数据库最大的差别可能是在扩展方式上,要支持日益增长的需求当然要扩展。要支持更多并发量,SQL数据库是纵向扩展,也就是说提高处理能力,使用速度更快速的计算机,这样处理相同的数据集就更快了。因为数据存储在关系表中,操作的性能瓶颈可能涉及很多个表,这都需要通过提高计算机性能来客服。虽然SQL数据库有很大扩展空间,但最终肯定会达到纵向扩展的上限。而NoSQL数据库是横向扩展的。非关系型数据存储天然就是分布式的,NoSQL数据库的扩展可以通过给资源池添加更多普通的数据库服务器(节点)来分担负载。
结构化查询VS非结构化查询
关系型数据库通过所谓结构化查询语言(也就是我们常说的SQL)来操作数据。SQL支持数据库CRUD(增加,查询,更新,删除)操作的功能非常强大,是业界标准用法。非关系型数据库以块(像文档一样)为单元操纵数据,使用所谓的非结构化查询语言(UnQL),它是没有标准的,因数据库提供商的不同而不同。关系型表中主键的概念对应非关系存储中的文档Id。SQL数据库使用预定义优化方式(比如列索引定义)帮助加速查询操作,而NoSQL数据库采用更简单而精确的数据访问模式。
映射VS本地化
SQL和NoSQL数据存储的选择还取决于开发人员,尽管这个因素影响不大。采用面向对象编程语言的开发人员通常会同时操作一个或多个数据实体(包括嵌套数据、列表和数组的复杂结构),把数据传递给应用程序用户界面。要是讨论到底层数据库,事情就并不总是那么公平合理了。在关系型存储中,数据实体通常需要分成多个部分进行规范化,然后分开存储到多个关系型表中精简存储。幸运的是,这是一个长期存在的问题,大部分编程平台都有相应的简单解决方案,比如ORM层(对象关系映射)。ORM是位于关系型数据源和开发者使用的面向对象数据实体之间的一个映射层。然而,对于非关系型存储,不需要规范化数据,复杂数据实体可以整体存放在独立单元中。应用程序中使用的对象通常序列化为JSon串,存储在NoSQL数据库的JSon文档中。
事务性VS纯扩展性
如果你的数据操作需要高事务性或者复杂数据查询需要控制执行计划,那么传统的SQL数据库从性能和稳定性方面考虑是你的最佳选择。SQL数据库支持对事务原子性细粒度控制,并且易于回滚事务。虽然NoSQL数据库也可以使用事务操作,但它们真正闪亮的价值是在操作的扩展性和大数据量处理方面。
ACID VS CAP
SQL 数据库久负盛名的价值就是通过所谓的ACID属性(原子性,一致性,隔离性,持久性)保证数据完整性,大部分关系型存储供应商都支持ACID。我们的目标是支持隔离不可分割的事务,其变化是持久的,数据也保持一致状态。而NoSQL数据库是让你在CAP(一致性,可用性,分区容忍度)中的任意两项中选择,因为在基于节点的分布式系统中,很难做到三项都满足。
数据VS大数据
SQL数据库可以可靠地存储和处理数据,而NoSQL最大的优势是在应对大数据方面,也就是由我们社会或者计算机每天产生的大量非结构化的数据实体。NoSQL用无模式方式做数据管理,所以其横向扩展潜力是无限的,这可能是深度处理大数据捕获、管理、检索、分析和可视化的唯一有效途径。
数据记录VS物联网和人联网
关系数据库在关注数据规范化和保证性能的基础上精简存储。但是近年来,我们产生数据的速度远大于关系型存储能满足存储的能力增长。刺激数据如此迅猛增长的原因是:巨大量的用户数和物联网。连接到互联网的用户在成倍增加,在同步使用我们的应用。由于大量移动设备数据传感设备接入互联网,机器产生的数据量也大幅增加。因此企业必须寻求NoSQL技术及基础架构来处理持续涌入的半结构化和非结构化数据。
内部部署VS云计算
云计算现在已经无处不在了,它兼具SQL和NoSQL数据库的益处。云环境中的关系型存储通常是以服务形式提供的,是可复制、高可用性且分布式的,极大地提高了横向扩展能力。托管于云服务中的NoSQL数据库也天然享有自动分片的好处,可以阶段性地灵活弹性处理,集成高速缓存和巨大的计算能力来捕获、存储和分析大数据。
付费VS开源
有一种看法认为,SQL数据库大多数比较昂贵,而NoSQL数据库通常都是开源的。事实上,两种类型数据库都有开源的和商业的。常见的SQL 数据库有微软公司的SQL Server,MySQL,SQLite,Oracle和PostGres。流行的NoSQL数据库有Couchbase,MongoDB,Redis,BigTable和RavenDB。
SQL和NoSQL这两者都有各自的优缺点,选择正确的架构取决于你构建应用的需求。
来源:http://m.blog.csdn.net/article/details?id=51779361
现在来说下什么是MySQL?
MySQL是最受欢迎的开源SQL数据库管理系统,由Oracle Corporation开发,分发和支持。
MySQL网站(http://www.mysql.com/)提供有关MySQL软件的最新信息。
MySQL是一个数据库管理系统。
数据库是数据的结构化集合。
它可以是从简单的购物清单到图片库或公司网络中的大量信息。要添加,访问和处理存储在计算机数据库中的数据,您需要一个数据库管理系统,如MySQL Server。
由于计算机非常擅长处理大量数据,因此数据库管理系统在计算,独立实用程序或其他应用程序的一部分中发挥着核心作用。
MySQL数据库是关系型的。
关系数据库将数据存储在单独的表中,而不是将所有数据放在一个大的库房中。数据库结构被组织成针对速度优化的物理文件。逻辑模型具有数据库,表,视图,行和列等对象,可提供灵活的编程环境。
您可以设置管理不同数据字段之间关系的规则,例如一对一,一对多,唯一,必需或可选,以及 不同表之间的“ 指针 ”。数据库强制执行这些规则,因此使用设计良好的数据库,您的应用程序永远不会看到不一致,重复,孤立,过时或丢失的数据。
“ MySQL ” 的SQL部分代表 “ 结构化查询语言 ”。SQL是用于访问数据库的最常用的标准化语言。根据您的编程环境,您可以直接输入SQL(例如,生成报告),将SQL语句嵌入到用其他语言编写的代码中,或使用隐藏SQL语法的特定于语言的API。
SQL由ANSI / ISO SQL标准定义。SQL标准自1986年以来一直在发展,并且存在多个版本。在本手册中,“ SQL-92 ”是指1992年发布的标准,“ SQL:1999 ”是指1999年发布的标准,“ SQL:2003 ”是指当前版本的标准。我们在任何时候都使用短语 “ SQL标准 ”来表示当前版本的SQL标准。
MySQL软件是开源的。
开源意味着任何人都可以使用和修改软件。任何人都可以从互联网上下载MySQL软件并使用它而无需支付任何费用。如果您愿意,您可以学习源代码并根据需要进行更改。
MySQL软件使用GPL(GNU通用公共许可证)http://www.fsf.org/licenses/来定义在不同情况下您可能和不可以使用该软件的内容。如果您对GPL感到不舒服或需要将MySQL代码嵌入到商业应用程序中,您可以从我们这里购买商业许可版本。有关更多信息,请参阅MySQL许可概述(http://www.mysql.com/company/legal/licensing/)。
MySQL数据库服务器非常快速,可靠,可扩展且易于使用。
MySQL服务器可以在台式机或笔记本电脑上与其他应用程序,Web服务器等一起轻松运行,几乎不需要关注。如果您将整台机器专用于MySQL,则可以调整设置以利用所有可用的内存,CPU功率和I / O容量。MySQL还可以扩展到联网的机器集群。
MySQL Server适用于客户端/服务器或嵌入式系统。
MySQL数据库软件是一个客户端/服务器系统,由支持不同后端的多线程SQL服务器,几个不同的客户端程序和库,管理工具以及各种应用程序编程接口(API)组成。
我们还提供MySQL Server作为嵌入式多线程库,您可以将其链接到您的应用程序,以获得更小,更快,更易于管理的独立产品。
MySQL的主要特点
MySQL数据库软件的一些重要特性。
内部和可移植性
-
用C和C ++编写。
-
经过多种不同编译器的测试。
-
适用于许多不同的平台。请参阅 https://www.mysql.com/support/supportedplatforms/database.html。
-
为了便于携带,在MySQL 5.5及更高版本中使用CMake。以前的系列使用GNU Automake,Autoconf和Libtool。
-
使用Purify(商业内存泄漏检测器)以及GPL工具Valgrind(http://developer.kde.org/~sewardj/)进行测试。
-
使用具有独立模块的多层服务器设计。
-
设计为使用内核线程完全多线程,以便在可用时轻松使用多个CPU。
-
提供事务性和非事务性存储引擎。
-
使用
MyISAM
具有索引压缩的非常快速的B树磁盘表()。 -
旨在使添加其他存储引擎相对容易。如果要为内部数据库提供SQL接口,这非常有用。
-
使用非常快速的基于线程的内存分配系统。
-
使用优化的嵌套循环连接执行非常快速的连接。
-
实现内存中的哈希表,用作临时表。
-
使用应尽可能快的高度优化的类库实现SQL函数。通常在查询初始化之后根本没有内存分配。
-
将服务器作为单独的程序提供,用于客户端/服务器网络环境,以及作为可嵌入(链接)到独立应用程序的库。此类应用程序可以单独使用,也可以在没有网络的环境中使用。
数据类型
-
许多数据类型:有符号/无符号整数1,2,3,4,和8个字节长,
FLOAT
,DOUBLE
,CHAR
,VARCHAR
,BINARY
,VARBINARY
,TEXT
,BLOB
,DATE
,TIME
,DATETIME
,TIMESTAMP
,YEAR
,SET
,ENUM
,和开放GIS空间类型。请参见第11章,数据类型。 -
固定长度和可变长度的字符串类型。
陈述和职能
-
查询
SELECT
列表和WHERE
子句中的 完整运算符和函数支持 。例如:mysql> SELECT CONCAT(first_name, ' ', last_name) -> FROM citizen -> WHERE income/dependents > 10000 AND age > 30;
-
完全支持SQL
GROUP BY
和ORDER BY
子句。支持基函数(COUNT()
,AVG()
,STD()
,SUM()
,MAX()
,MIN()
,和GROUP_CONCAT()
)。 -
支持
LEFT OUTER JOIN
和RIGHT OUTER JOIN
使用标准SQL和ODBC语法。 -
根据标准SQL的要求支持表和列上的别名。
-
支持
DELETE
,INSERT
,REPLACE
,和UPDATE
以返回更改(受影响)的行数,或返回通过连接到服务器时设置标志,而不是匹配的行的数量。 -
支持特定于MySQL的
SHOW
语句,用于检索有关数据库,存储引擎,表和索引的信息。支持INFORMATION_SCHEMA
数据库,根据标准SQL实现。 -
一个
EXPLAIN
语句来显示优化器如何解决一个查询。 -
表名或列名中函数名的独立性。例如,
ABS
是一个有效的列名。唯一的限制是,对于函数调用,函数名和它后面的“(
”之间不允许有空格。请参见 第9.3节“关键字和保留字”。
安全
可扩展性和限制
-
支持大型数据库。我们将MySQL Server与包含5000万条记录的数据库结合使用。我们也知道使用MySQL服务器的用户有200,000个表和大约5,000,000,000行。
-
每个表最多支持64个索引。每个索引可以包含1到16列或部分列。
InnoDB
表的最大索引宽度为767字节或3072字节。请参见 第15.6.1.6节“InnoDB表的限制”。MyISAM
表的最大索引宽度为1000个字节。请参见第16.2节“MyISAM存储引擎”。索引可使用的柱的前缀CHAR
,VARCHAR
,BLOB
,或TEXT
列类型。
连接
-
客户端可以使用多种协议连接到MySQL Server:
-
客户端可以在任何平台上使用TCP / IP套接字进行连接。
-
在Windows系统上,如果使用该
--enable-named-pipe
选项启动服务器,则客户端可以使用命名管道进行连接 。如果使用该--shared-memory
选项启动,Windows服务器也支持共享内存连接 。客户端可以使用该--protocol=memory
选项通过共享内存进行连接 。 -
在Unix系统上,客户端可以使用Unix域套接字文件进行连接。
-
-
MySQL客户端程序可以用多种语言编写。用C编写的客户端库可用于用C或C ++编写的客户端,或者用于提供C绑定的任何语言。
-
提供C,C ++,Eiffel,Java,Perl,PHP,Python,Ruby和Tcl的API,使MySQL客户端能够以多种语言编写。请参见第28章,连接器和API。
-
Connector / ODBC(MyODBC)接口为使用ODBC(开放式数据库连接)连接的客户端程序提供MySQL支持。例如,您可以使用MS Access连接到MySQL服务器。客户端可以在Windows或Unix上运行。连接器/ ODBC源可用。与许多其他功能一样,支持所有ODBC 2.5功能。请参阅 MySQL Connector / ODBC开发人员指南。
-
Connector / J接口为使用JDBC连接的Java客户端程序提供MySQL支持。客户端可以在Windows或Unix上运行。连接器/ J源可用。请参阅MySQL Connector / J 5.1开发人员指南。
-
MySQL Connector / NET使开发人员能够轻松创建需要与MySQL进行安全,高性能数据连接的.NET应用程序。它实现了所需的ADO.NET接口,并集成到ADO.NET感知工具中。开发人员可以使用他们选择的.NET语言来构建应用程序。MySQL Connector / NET是一个完全托管的ADO.NET驱动程序,用100%纯C#编写。请参阅 MySQL Connector / NET Developer Guide。
本土化
-
服务器可以以多种语言向客户端提供错误消息。请参见第10.11节“设置错误消息语言”。
-
几个不同的字符集,包括全面支持
latin1
(CP1252) ,german
,big5
,ujis
一些Unicode字符集等。例如,表格和列名称中允许使用斯堪的纳维亚字符“å
”, “ä
”和 “ö
”。 -
所有数据都保存在所选字符集中。
-
根据默认字符集和排序规则进行排序和比较。启动MySQL服务器时可以更改此设置(请参见 第10.3.2节“服务器字符集和排序”)。要查看非常高级排序的示例,请查看捷克排序代码。MySQL Server支持许多可在编译时和运行时指定的不同字符集。
-
可以动态更改服务器时区,并且各个客户端可以指定自己的时区。请参见 第5.1.13节“MySQL服务器时区支持”。
客户端和工具
-
MySQL包括几个客户端和实用程序。这些包括命令行程序,如 mysqldump和 mysqladmin,以及图形程序,如 MySQL Workbench。
-
MySQL Server内置支持SQL语句来检查,优化和修复表。这些语句可以从命令行通过 mysqlcheck客户端获得。MySQL还包括myisamchk,这是一个非常快速的命令行实用程序,用于在
MyISAM
表上执行这些操作。请参见第4章,MySQL程序。 -
可以使用
--help
或-?
选项调用MySQL程序以获取在线帮助。
MySQL的历史
我们最初的目的是使用 mSQL
数据库系统使用我们自己的快速低级(ISAM)例程连接到我们的表。然而,经过一些测试,我们得出的结论mSQL
是,对于我们的需求来说,这个结论还不够快或不够灵活。这导致了一个新的SQL接口到我们的数据库,但具有几乎相同的API接口mSQL
。此API旨在使用于编写的第三方代码能够 mSQL
轻松移植以便与MySQL一起使用。
MySQL以联合创始人Monty Widenius的女儿My。命名。
MySQL Dolphin(我们的标识)的名称是“ Sakila ” ,它是从我们的“ 海豚名人”比赛用户建议的大量名单中选出的。获奖名称由非洲斯威士兰的开源软件开发商Ambrose Twebaze提交。根据安布罗斯的说法,女性名字Sakila的根源在于斯威士兰当地语言SiSwati。Sakila也是坦桑尼亚阿鲁沙一个小镇的名字,靠近Ambrose的原籍乌干达。