⑴培养兴趣
兴趣是最好的老师,不论学习什么知识,兴趣均可以极大地提升学习效率。固然学习MySQL 5.6也不例外。
⑵夯实基础
计算机领域的技术很是强调基础,刚开始学习可能还认识不到这一点,随着技术应用的深 入,只有有着扎实的基础功底,才能在技术的道路上走得更快、更远。对于MySQL的学习来讲, SQL语句是其中最为基础的部分,不少操做都是经过SQL语句来实现的。因此在学习的过程当中, 读者要多编写SQL语句,对于同一个功能,使用不一样的实现语句来完成,从而深入理解其不一样之处。
(3)及时学习新知识
正确、有效地利用搜索引擎,能够搜索到不少关于MySQL 5.6的相关知识。同时,参考别 人解决问题的思路,也能够吸收别人的经验,及时获取最新的技术资料。
⑷多实践操做
数据库系统具备极强的操做性,须要多动手上机操做。在实际操做的过程当中才能发现问题, 并思考解决问题的方法和思路,只有这样才能提升实战的操做能力。mysql
MySQL服务器配置窗口中各个参数的含义以下。
【Server Configuration Type】该选项用于设置服务器的类型。单击该选项右侧的向下按钮, 便可看到包括3个选项。web
(1) Development Machine(开发机器):该选项表明典型我的用桌面工做站。假定机器上运行 着多个桌面应用程序。将MySQL服务器配置成使用最少的系统资源。sql
(2) Server Machine (服务器):该选项表明服务器,MySQL服务器能够同其它应用程序一块儿 运行,例如FTP、email和web服务器。MySQL服务器配置成使用适当比例的系统资源。数据库
(3) DedicatedMySQL Server Machine (专用 MySQL 服务器):该选项表明只运行MySQL服务的服务器。假定运行没有运行其它应用程序。MySQL服务器配置成使用全部可用系统资源。做为初学者,建议选择【DevelopmentMachine】(开发者机器)选项,这样占用系统的资源 比较少。安全
不一样存储引擎都有各自的特色,以适应不一样的需求,以下表所示。为了作出选择:服务器
一、首先需 要考虑每个存储引擎提供了哪些不一样的功能。若是要提供提交,回滚和崩溃恢复能力的事务安全(ACID兼容)能力,并要求实现并发控 制,InnoDB是个很好的选择。若是数据表主要用来插入和查询记录,则MyISAM引擎能提供较 高的处理效率;若是只是临时存放数据,数据量不大,而且不须要较高的数据安全性,能够选择将数据保存在内存中的Memory引擎,MySQL中使用该引擎做为临时表,存放查询的中间结果。若是只有INSERT和SELECT操做,能够选择Archive引擎,Archive存储引擎支持高并发的插 入操做,可是自己并非事务安全的。Archive存储引擎很是适合存储归档数据,如记录日志信 息可使用Archive引擎。架构
二、使用哪种引擎要根据须要灵活选择,一个数据库中多个表可使用不一样引擎以知足各类性能和实际需求。并发
三、使用合适的存储引擎,将会提升整个数据库的性能。函数
使用SHOW ENGINES语句查看系统中全部的存储引擎,其中包括默认的存储引擎。能够看出来当前数据库系统中有五种存储引擎,默认是MyISAM。还可使用一种直接的方法查看默认存储引擎。执行结果直接显示了当前默认的存储引擎为MyISAM。高并发
表删除操做将把表的定义和表中的数据一块儿删除,而且MySQL在执行删除操做时,不会有 任何的确认信息提示,所以执行删除操时,应当慎重。在删除表前,最好对表中的数据进行备份, 这样当操做失误时,能够对数据进行恢复,以避免形成没法挽回的后果。一样的,在使用ALTER TABLE进行表的基本修改操做时,在执行操做过程以前,也应该 确保对数据进行完整的备份,由于数据库的改变是没法撤销的,若是添加了一个不须要的字段, 能够将其删除;相同的,若是删除了一个须要的列,该列下面的全部数据都将会丢失。
并非每个表中都须要主键,通常的,若是多个表之间进行链接操做时,须要用到主键。 所以并不须要为每一个表创建主键,并且有些状况最好不使用主键。
外键约束(FOREIGN KEY)不能跨引擎使用。MySQL支持多种存储引擎,每个表均可 以指定一个不一样的存储引擎,可是要注意:外键约束是用来保证数据的参照完整性,若是表之间 须要关联外键,却指定了不一样的存储引擎,这些表之间是不能建立外键约束的。因此说,存储引 擎的选择也不彻底是随意的。
默认的,在MySQL中,AUTO_INCREMENT的初始值是1,每新增一条记录,字段值自动加1。设置自增属性(AUTO_INCREMENT)的时候,还能够指定第一条插入记录的自增字段的 值,这样新插入的记录的自增字段值从初始值开始递增,如在tb_emp8中插入第一条记录,同时 指定id值为5,则之后插入的记录的id值就会从6开始往上增长。添加惟一性的主键约束时, 每每须要设置字段自动增长属性。
TIMESTAMP与DATETIME除了存储字节和支持的范围不一样外,还有一个最大的区别就是: DATETIME在存储日期数据时,按实际输入的格式存储,即输入什么就存储什么,与时区无关; 而TIMESTAMP值的存储是以UTC(世界标准时间)格式保存的,存储时对当前时区进行转换, 检索时再转换回当前时区。即查询时,根据当前时区的不一样,显示的时间值是不一样的。
MySQL提供了大量的数据类型,为了优化存储,提升数据库性能,在任何状况下均应使用 最精确的类型。即在全部能够表示该列值的类型中,该类型使用的存储最少。
1.整数和浮点数
若是不须要小数部分,则使用整数来保存数据;若是须要表示小数部分,则使用浮点数类 型。对于浮点数据列,存入的数值会对该列定义的小数位进行四舍五入。例如若是列的值的范 围为1〜99999,若使用整数,则MEDIUMINT UNSIGNED是最好的类型;若须要存储小数,则 使用FLOAT类型。浮点类型包括FLOAT和DOUBLE类型。DOUBLE类型精度比FLOAT类型高,所以,如要求存储精度较高时,应选择DOUBLE类型。
2.浮点数和定点数
浮点数FLOAT,DOUBLE相对于定点数DECIMAL的优点是:在长度必定的状况下,浮点 数能表示更大的数据范围。可是因为浮点数容易产生偏差,所以对精确度要求比较高时,建议使 用DECIMAL来存储。DECIMAL在MySQL中是以字符串存储的,用于定义货币等对精确度要 求较高的数据。在数据迁移中,float(M,D)是非标准SQL定义,数据库迁移可能会出现问题,最 好不要这样使用。另外两个浮点数进行减法和比较运算时也容易出问题,所以在进行计算的时候, 必定要当心。若是进行数值比较,最好使用DECIMAL类型。
3.日期与时间类型
MySQL对于不一样种类的日期和时间有不少的数据类型,好比YEAR和TIME。若是只须要 记录年份,则使用YEAR类型便可;若是只记录时间,只须使用TIME类型。若是同时须要记录日期和时间,则可使用TIMESTAMP或者DATETIME类型。因为 TIMESTAMP列的取值范围小于DATETIME的取值范围,所以存储范围较大的日期最好使用 DATETIME。TIMESTAMP也有一个DATETIME不具有的属性。默认的状况下,当插入一条记录但并没 有指定TIMESTAMP这个列值时,MySQL会把TIMESTAMP列设为当前的时间。所以当须要 插入记录同时插入当前时间时,使用TIMESTAMP是方便的,另外TIMESTAMP在空间上比 DATETIME更有效。
4.CHAR与VARCHAR之间的特色与选择
CHAR是固定长度字符,VARCHAR是可变长度字符;CHAR会自动删除插入数据的尾部 空格,VARCHAR不会删除尾部空格。
CHAR是固定长度,因此它的处理速度比VARCHAR的速度要快,可是它的缺点就是浪费 存储空间。因此对存储不大,但在速度上有要求的可使用CHAR类型,反之可使用 VARCHAR类型来实现。
对于MyISAM存储引擎:最好使用固定长度的数据列代替可变长度的数据列。这样可使 整个表静态化,从而使数据检索更快,用空间换时间。
对于InnoDB存储引擎:使用可变长度的数据列,由于InnoDB数据表的存储格式不分固定 长度和可变长度,所以使用CHAR不必定比使用VARCHAR更好,但因为VARCHAR是按照 实际的长度存储,比较节省空间,因此对磁盘I/O和数据存储总量比较好。
5.ENUM 和 SET
ENUM只能取单值,它的数据列表是一个枚举集合。它的合法取值列表最多容许有65 535 个成员。所以,在须要从多个值中选取一个时,可使用ENUM。好比:性别字段适合定义为 ENUM类型,每次只能从’男’或’女’中取一个值。SET可取多值。它的合法取值列表最多容许有64个成员。空字符串也是一个合法的SET值。 在须要取多个值的时候,适合使用SET类型,好比:要存储一我的兴趣爱好,最好使用SET类型。ENUM和SET的值是以字符串形式出现的,但在内部,MySQL以数值的形式存储它们。
6.BLOB 和 TEXT
BLOB是二进制字符串,TEXT是非二进制字符串,二者都可存放大容量的信息。BLOB主 要存储图片、音频信息等,而TEXT只能存储纯文本文件。应分清二者的用途。
诸如单引号(’),双引号("),反斜线()等符号,这些符号在MySQL中不能直接输入 使用,不然会产生意料以外的结果。在MySQL中,这些特殊字符称为转义字符,在输入时须要 以反斜线符号(’\’)开头,因此在使用单引号和双引号时应分别输入(\’)或者(\"),输入反 斜线时应该输入(\),其余特殊字符还有回车符(\r),换行符(\n),制表符(\tab),退格 符(\b)等。在向数据库中插入这些特殊字符时,必定要进行转义处理。
MySQL中的BLOB和TEXT字段类型能够存储数据量较大的文件,可使用这些数据类型 存储图像、声音或者是大容量的文本内容,例如网页或者文档。虽然使用BLOB或者TEXT可 以存储大容量的数据,可是对这些字段的处理会下降数据库的性能。若是并不是必要,能够选择只 储存文件的路径。
在Windows平台下,MySQL是不区分大小的,所以字符串比较函数也不区分大小写。若是 想执行区分大小写的比较,能够在字符串前面添加BINARY关键字。例如默认状况下,’a’=‘A’ 返回结果为1,若是使用BINARY关键字,BINARY’a’=‘A’结果为0,在区分大小写的状况下,’a’ 与’A’并不相同。
MySQL中,日期时间值以字符串形式存储在数据表中,所以可使用字符串函数分别截取日期时间值的不一样部分,例如某个名称为dt的字段有值“2010-10-01 12:00:30”,若是只须要获 得年值,能够输入LEFT(dt, 4),这样就得到了字符串左边开始长度为4的子字符串,即YEAR 部分的值;若是要获取月份值,能够输入MID(dt,6,2),字符串第6个字符开始,长度为2的子 字符串正好为dt中的月份值。同理,读者能够根据其余日期和时间的位置,计算并获取相应的值。
CONVERT()函数改变指定字符串的默认字符集,在开始的章节中,向读者介绍使用GUI图形化安装配置工具进行MySQL的安装和配置,其中的一个步骤是能够选择MySQL的默认字符集。可是,若是只改变字符集,没有必要把配置过程从新执行一遍,在这里,一个简单的方式是 修改配置文件。在Windows中,MySQL配置文件名称为my.ini,该文件在MySQL的安装目录下面。修改配置文件中的default-character-set和character-set-server参数值,将其改成想要的字 符集名称,如gbk、gb23十二、latinl等,修改完以后从新启动MySQL服务,便可生效。读者能够在修改字符集时使用SHOW VARIABLES LIKE ’character_set_°%’;命令查看当前字符集,以进行对比。
查询结果中,若是须要对列进行降序排序,可使用DESC,这个关键字只能对其前面的列 进行降序排列。例如,要对多列都进行降序排序,必需要在每一列的列名后面加DESC关键字。 而DISTINCT不一样,DISTINCT不能部分使用。换句话说,DISTINCT关键字应用于全部列而不 仅是它后面的第一个指定列。例如,查询3个字段s_id,f_name,f_price,若是不一样记录的这3个字段的组合值都不一样,则全部记录都会被查询出来。
在使用ORDER BY子句时,应保证其位于FROM子句以后,若是使用LIMIT,则必须位 于ORDER BY以后,若是子句顺序不正确,MySQL将产生错误消息。
在查询的时候,会看到在WHERE子句中使用条件,有的值加上了单引号,而有的值未加。 单引号用来限定字符串,若是将值与字符串类型列进行比较,则须要限定引号;而用来与数值进 行比较则不须要用引号。
任什么时候候使用具备AND和OR操做符的WHERE子句,都应该使用圆括号明确操做顺序。 若是条件较多,即便能肯定计算次序,默认的计算次序也可能会使SQL语句不易理解,所以使 用括号明确操做符的次序,是一个好的习惯。
在前面章节中能够看到,全部的UPDATE和DELETE语句全都在WHERE子句中指定了条 件。若是省略WHERE子句,则UPDATE或DELETE将被应用到表中全部的行。所以,除非 确实打算更新或者删除全部记录,不然要注意使用不带WHERE子句的UPDATE或DELETE 语句。建议在对表进行更新和删除操做以前,使用SELECT语句确认须要删除的记录,以避免造 成没法挽回的结果。
为数据库选择正确的索引是一项复杂的任务。若是索引列较少,则须要的磁盘空间和维护开销 都较少。若是在一个大表上建立了多种组合索引,索引文件也会膨胀很快。而另外一方面,索引较多 可覆盖更多的查询。可能须要试验若干不一样的设计,才能找到最有效的索引。能够添加、修改和删 除索引而不影响数据库架构或应用程序设计。所以,应尝试多个不一样的索引从而创建最优的索引。
对字符串类型的字段进行索引,若是可能应该指定一个前缀长度。例如,若是有一个 CHAR(255)的列,若是在前10个或30个字符内,多数值是唯一的,则不须要对整个列进行索引。 短索引不只能够提升查询速度并且能够节省磁盘空间、减小I/O操做。
在本质上它们都是存储程序。函数只能经过return语句返回单个值或者表对象;而存储过程 不容许执行return,可是能够经过out参数返回多个值。函数限制比较多,不能用临时表,只能用表变量,还有一些函数都不可用等等;而存储过程的限制相对就比较少。函数能够嵌入在SQL 语句中使用,能够在SELECT语句中做为查询语句的一个部分调用;而存储过程通常是做为一个独立的部分来执行。
目前,MySQL还不提供对已存在的存储过程代码的修改,若是必需要修改存储过程,必须使用DROP语句删除以后,再从新编写代码,或者建立一个新的存储过程。
存储过程包含用户定义的SQL语句集合,可使用CALL语句调用存储过程,固然在存储 过程当中也可使用CALL语句调用其余存储过程,可是不能使用DROP语句删除其余存储过程。
在定义存储过程参数列表时,应注意把参数名与数据库表中的字段名区别开来,不然将出 现没法预期的结果。
通常状况下,可能会出现存储过程当中传入中文参数的状况,例如某个存储过程根据用户的 名字查找该用户的信息,传入的参数值多是中文。这时须要在定义存储过程的时候,在后面加 上character set gbk,否则调用存储过程使用中文参数会出错,好比定义userInfo存储过程,代码 以下:
CREATE PROCEDURE useInfo(IN u_name VARCHAR(50) character set gbk, OUT u_age INT)
1.二者的区别:28.MySQL中视图和表的区别以及联系是什么?
(1)视图是已经编译好的SQL语句,是基于SQL语句的结果集的可视化的表,而表不是。
(2)视图没有实际的物理记录,而基本表有。
(3)表是内容,视图是窗口。
(4)表占用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表能够及时对它 进行修改,但视图只能用建立的语句来修改。
(5)视图是查看数据表的一种方法,能够查询数据表中某些字段构成的数据,只是一些SQL 语句的集合。从安全的角度来讲,视图能够防止用户接触数据表,于是用户不知道表结构。
(6)表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表。
(7)视图的创建和删除只影响视图自己,不影响对应的基本表。
2.二者的联系:
视图(view)是在基本表之上创建的表,它的结构(即所定义的列)和内容(即全部记录) 都来自基本表,它依据基本表存在而存在。一个视图能够对应一个基本表,也
能够对应多个基本 表。视图是基本表的抽象和在逻辑意义上创建的新关系。
在使用触发器的时候须要注意,对于相同的表,相同的事件只能建立一个触发器,好比对 表account建立了一个BEFORE INSERT触发器,那么若是对表account再次建立一个BEFORE INSERT触发器,MySQL将会报错,此时,只能够在表account上建立AFTER INSERT或者 BEFORE UPDATE类型的触发器。灵活的运用触发器将为操做省去不少麻烦。
触发器定义以后,每次执行触发事件,都会激活触发器并执行触发器中的语句。若是需求 发生变化,而触发器没有进行相应的改变或者删除,则触发器仍然会执行旧的语句,从而会影响 新的数据的完整性。所以,要将再也不使用的触发器及时删除。
建立用户有几种方法:GRANT语句、CREATE USER语句和直接操做user表。通常状况, 最好使用GRANT或者CREATE USER语句,而不要直接将用户信息插入user表,由于user表中存储了全局级别的权限以及其余的帐户信息,若是意外破坏了 user表中的记录,则可能会对 MySQL服务器形成很大影响。
mysqldump备份的文本文件实际是数据库的一个副本,使用该文件不只能够在MySQL中恢 复数据库,并且经过对该文件的简单修改,可使用该文件在SQL Server或者Sybase等其余数 据库中恢复数据库。这在某种程度上实现了数据库之间的迁移。
直接复制数据文件是最为直接、快速的备份方法,但缺点是基本上不能实现增量备份。备 份时必须确保没有使用这些表。若是在复制一个表的同时服务器正在修改它,则复制无效。备份 文件时,最好关闭服务器,而后从新启动服务器。为了保证数据的一致性,须要在备份文件前, 执行如下SQL语句:
CREATE PROCEDURE useInfo(IN u_name VARCHAR(50) character set gbk, OUT u_age INT)
目录下便可。mysqlhotcopy 是一个 PERL 程序,它使用 LOCK TABLES、FLUSH TABLES 和 cp 或 scp来快速备份数据库。它是备份数据库或单个表的最快的途径,但它只能运行在数据库文件所在的 机器上,而且mysqlhotcopy只能用于备份MyISAM表。mysqlhotcopy适合于小型数据库的备份, 数据量不大,可使用mysqlhotcopy程序天天进行一次彻底备份。mysqldump将数据表导成SQL脚本文件,在不一样的MySQL版本之间升级时相对比较合适, 这也是最经常使用的备份方法。mysqldump比直接复制要慢些。也就是把内存中的数据都刷新到磁盘中,同时锁定数据表,以保证复制过程当中不会有新的 数据写入。这种方法备份出来的数据恢复也很简单,直接复制回原来的数据库
日志既会影响MySQL的性能,又会占用大量磁盘空间。所以,若是没必要要,应尽量少地 开启日志。根据不一样的使用环境,能够考虑开启不一样的日志。例如,在开发环境中优化查询效率 低的语句,能够开启慢查询日志;若是须要记录用户的全部查询操做,能够开启通用查询日志; 若是须要记录数据的变动,能够开启二进制日志;错误日志是默认开启的。
二进制日志主要用来记录数据变动。若是须要记录数据库的变化,能够开启二进制日志。 基于二进制日志的特性,不只能够用来进行数据恢复,还可用于数据复制。在数据库按期备份的 状况下,若是出现数据丢失,能够先用备份恢复大部分数据,而后使用二进制日志恢复最近备份 后变动的数据。在双机热备状况下,可使用MySQL的二进制日志记录数据的变动,而后将变 更部分复制到备份服务器上。
慢查询日志主要用来记录查询时间较长的日志。在开发环境下,能够开启慢查询日志来记 录查询时间较长的查询语句,而后对这些语句进行优化。经过配long_query_time的值,能够灵活地掌握不一样程度的慢查询语句。
合理的索引能够提升查询的速度,但不是索引越多越好。在执行插入语句的时候,MySQL 要为新插入的记录创建索引。因此过多的索引会致使插入操做变慢。原则上是只有查询用的字段 才创建索引。
查询缓冲区能够提升查询的速度,可是这种方式只适合查询语句比较多、更新语句比较少 的状况。默认状况下查询缓冲区的大小为〇,也就是不可用。能够修改queiy_cache_size以调整 查询缓冲区大小;修改query_cache_type以调整查询缓冲区的类型。在my.ini中修改 query_cache_size 和 query_cache_type 的值以下所示:
[mysqld]
query_cache_size= 512M query_cache_type= 1
query_cache_type=1
表示开启查询缓冲区。只有在查询语句中包含SQL_NO_CACHE关键字 时,才不会使用查询缓冲区。可使用FLUSH QUERY CACHE语句来刷新缓冲区,清理查询缓 冲区中的碎片。