无论是运维、开发、测试,还是架构师,数据库技术都是必备的加薪神器。那么,如果你口口声声说要学习数据库和MySQL,你想学吗?什么东西?本文为您揭晓,值得您一读!1、如何快速掌握MySQL?⑴培养兴趣兴趣是最好的老师,无论学习什么知识,兴趣都能大大提高学习效率。当然,学习MySQL5.6也不例外。⑵巩固基础计算机领域的技术非常重视基础,这在刚开始学习时可能没有意识到。随着技术应用的深入,只有扎实的基础,才能在技术的道路上走得更快、更远。对于MySQL的学习,SQL语句是最基础的部分,很多操作都是通过SQL语句实现的。因此,读者在学习的过程中,要多写SQL语句,用不同的实现语句来完成同一个功能,深刻体会其中的差异。(3)及时学习新知识通过正确有效地使用搜索引擎,可以找到大量关于MySQL5.6的相关知识。同时,通过参考别人解决问题的思路,也可以借鉴别人的经验,及时获取最新的技术信息。⑷多机操作数据库系统可操作性强,需要多次上机操作。只有在实际操作过程中才能发现问题,才能思考解决问题的方法和思路。只有这样,才能提高实战的操作能力。2、如何选择服务器类型?MySQL服务器配置窗口中各参数的含义如下。【ServerConfigurationType】该选项用于设置服务器的类型。单击选项右侧的向下按钮可以看到包含3个选项。三个选项的具体含义如下。(1)DevelopmentMachine(开发机):这个选项代表典型的个人桌面工作站。假设机器上运行着多个桌面应用程序。配置MySQL服务器以使用最少的系统资源。(2)ServerMachine(服务器):该选项代表服务器,MySQL服务器可以与其他应用程序一起运行,如FTP、email和web服务器。MySQL服务器配置为使用适当比例的系统资源。(3)DedicatedMySQLServerMachine(专用MySQL服务器):该选项代表一台只运行MySQL服务的服务器。假设没有其他应用程序正在运行。MySQL服务器配置为使用所有可用的系统资源。作为初学者,建议选择[DevelopmentMachine](开发者机器)选项,占用系统资源少。3、如何选择存储引擎不同的存储引擎各有特点,可以满足不同的需求,如下表所示。为了做出选择:(1)首先需要考虑每个存储引擎提供了哪些不同的功能。如果你想提供提交、回滚和崩溃恢复能力的事务安全(ACID兼容)能力,并且需要并发控制,InnoDB是一个不错的选择。如果数据表主要用于插入和查询记录,MyISAM引擎可以提供更高的处理效率;如果数据只是临时存储,数据量不大,对数据安全性要求不高,可以选择将数据保存在内存中MySQL中的Memory引擎就是使用这个引擎作为临时表来存储中间结果的查询。如果只有INSERT和SELECT操作,可以选择Archive引擎。Archive存储引擎支持高度并发的插入操作,但它不是事务安全的。Archive存储引擎非常适合存储归档数据,比如记录日志信息,可以使用Archive引擎。(2)使用何种发动机应根据需要灵活选择。一个数据库中的多个表可以使用不同的引擎来满足各种性能和实际需求。(3)使用合适的存储引擎会提高整个数据库的性能。4、如何查看默认存储引擎?使用SHOWENGINES语句查看系统中所有的存储引擎,包括默认的存储引擎。可以看出当前数据库系统中有五种存储引擎,默认的是MyISAM。还有一种直接查看默认存储引擎的方法。执行结果直接显示当前默认的存储引擎是MyISAM。5.删除表时要谨慎。表删除操作会将表的定义和表中的数据一起删除,MySQL在执行删除操作时不会提示任何确认信息,所以执行删除操作时要谨慎。在删除表之前,最好备份表中的数据,这样当出现操作错误时,可以恢复数据,避免造成不可挽回的后果。同样,在使用ALTERTABLE进行基本的表修改操作时,也应确保在执行操作过程之前数据已完全备份,因为数据库更改无法撤消。如果添加了不需要的字段,可以将其删除;同样,如果您删除了一个必填列,该列下的所有数据都将丢失。6.每张表都有主键吗?并非每个表都需要主键。通常,如果在多个表之间进行连接操作,则需要使用主键。因此,没有必要为每个表都建立主键,有些情况下最好不要使用主键。7、每张表可以任意选择存储引擎吗?外键约束(FOREIGNKEY)不能跨引擎使用。MySQL支持多种存储引擎。每个表可以指定不同的存储引擎,但需要注意的是使用外键约束来保证数据的引用完整性。如果表之间需要关联外键,则指定不同的存储引擎。存储引擎,这些表之间不能创建外键约束。因此,存储引擎的选择并不是完全随意的。8、AUTO_INCREMENT约束的字段值是否从1开始?默认情况下,在MySQL中,AUTO_INCREMENT的初始值为1,每增加一条新记录,字段值自动增加1。在设置自增属性(AUTO_INCREMENT)时,也可以指定第一条插入记录的自增字段,使得新插入记录的自增字段的值从初始值开始增加,比如在tb_emp8条记录中插入***,指定id值为5,那么后面插入的记录的id值将从6开始增加。在添加唯一主键约束时,往往需要设置字段自增属性。9、AUTO_INCREMENT约束的字段值是否从1开始?TIMESTAMP和DATETIME的存储字节和支持的范围不同,还有一个很大的区别:DATETIME在存储日期数据时,是按照实际输入的格式存储的,即输入什么就存储什么,不考虑时区;TIMESTAMP值的存储以UTC(CoordinatedUniversalTime)格式保存,存储时转换当前时区,检索时再转换回当前时区。即查询时,显示的时间值根据当前时区不同而不同。10、选择数据类型的方法和技巧有哪些?MySQL提供了大量的数据类型。为了优化存储和提高数据库性能,无论如何都应该使用最准确的类型。也就是说,在所有可以表示该列值的类型中,该类型使用的存储量最少。(1).整数和浮点数如果不需要小数部分则使用整数来存储数据;如果他们需要表示小数部分,请使用浮点数类型。对于浮点数据列,存储的值四舍五入到为该列定义的小数位数。比如列的取值范围是1到99999,如果使用整数,MEDIUMINTUNSIGNED是最好的类型;如果需要存储小数,则使用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快,但缺点是浪费存储空间。因此,如果存储量不大,但要求速度,可以使用CHAR类型,反之,可以使用VARCHAR类型。存储引擎对CHAR和VARCHAR选择的影响:对于MyISAM存储引擎:***使用定长数据列,而不是变长数据列。这使得整个表静态化,使数据检索更快,以空间换取时间。对于InnoDB存储引擎:使用变长数据列,因为InnoDB数据表的存储格式不区分定长和变长,所以使用CHAR不一定比使用VARCHAR好,但是因为VARCHAR是按照实际长度,更节省空间,因此对磁盘I/O总量和数据存储量更好。(5).ENUM和SETENUM只能取单值,其数据列表为枚举集。其合法值列表最多允许65535个成员。因此,当您需要从多个值中选择一个时,您可以使用ENUM。例如:gender字段适合定义为ENUM类型,每次只能从'male'或'female'中取一个值。SET可以取多个值。其合法值列表最多允许64个成员。空字符串也是有效的SET值。当需要取多个值时,使用SET类型比较合适,比如:存储一个人的爱好,最好使用SET类型。ENUM和SET的值以字符串形式出现,但在内部,MySQL将它们存储为数字。(6).BLOB和TEXTBLOB是二进制字符串,TEXT是非二进制字符串,两者都可以存储大容量的信息。BLOB主要存放图片、音频信息等,而TEXT只能存放纯文本文件。应区分两者的目的。11.如何在MySQL中使用特殊字符?单引号(')、双引号(")、反斜杠()等符号在MySQL中不能直接输入和使用,否则会产生意想不到的结果。在MySQL中,这些特殊字符称为转输入时,需要以反斜杠('')开头,所以在使用单引号和双引号时,分别输入(')或("),输入反斜杠时应输入(),其他特殊字符还包括回车()、换行()、制表符(ab)、退格()等,在向数据库中插入这些特殊字符时,一定要进行转义。12、MySQL可以存储文件吗?MySQL中的BLOB和TEXT字段类型可以存储数据量很大的文件,这些数据类型可以用来存储图像、声音或者大容量的文本内容,例如网页或文档。虽然BLOB或TEXT可以用来存储大容量的数据,但是对这些字段的处理会降低数据库的性能。如果不需要,您可以选择只保存文件的路径。13.如何在MySQL中进行区分大小写的字符串比较?Windows平台下,MySQL不区分大小写,所以字符串比较函数也不区分大小写。如果要进行区分大小写的比较,可以在字符串前加上BINARY关键字。例如默认'a'='A'返回结果1,如果使用BINARY关键字,BINARY'a'='A'的结果为0,区分大小写的情况下,'a'和'A'不一样。14、如何从日期时间值中获取年、月、日等部分日期或时间值?在MySQL中,日期和时间值是以字符串的形式存储在数据表中的,所以可以使用字符串函数截取日期和时间值的不同部分,比如一个名为dt的字段的值为“2010-10-0112:00:30",如果只需要获取年份值,可以输入LEFT(dt,4),这样就可以得到从字符串左边开始长度为4的子串,即YEAR部分的值;如果要获取月份值,可以输入MID(dt,6,2),从字符串的第6个字符开始,长度为2的子串就是dt中的月份值。同样,读者可以根据其他日期时间位置,计算得到相应的数值。15.如何更改默认字符集?CONVERT()函数更改指定字符串的默认字符集。第一章向读者介绍使用GUI图形化安装配置工具安装配置MySQL。其中一个步骤是选择MySQL的默认字符集。但是,如果您只是更改字符集,则无需重新执行配置过程。这里,一个简单的方法就是修改配置文件。在Windows下,MySQL的配置文件名为my.ini,位于MySQL安装目录下。修改配置文件中的default-character-set和character-set-server参数值,改为自己想要的字符集名称,如gbk、gb2312、latinl等,修改完成后重启MySQL服务生效。读者可以使用SHOWVARIABLESLIKE'character_set_°%';命令查看当前字符集,用于修改字符集时进行比较。16.DISTINCT可以应用于所有列吗?在查询结果中,如果需要对列进行降序排序,可以使用DESC。该关键字只能对列进行降序排序。例如,要对多列进行降序排序,必须在每列的列名后加上DESC关键字。与DISTINCT不同,DISTINCT不能部分使用。换句话说,DISTINCT关键字适用于所有列,而不仅仅是它之后的第一个指定列。比如查询3个字段s_id、f_name、f_price,如果这3个字段在不同记录中的组合值不同,则查询所有记录。17.ORDERBY可以和LIMIT混用吗?使用ORDERBY子句时,确保它位于FROM子句之后。如果使用LIMIT,它必须位于ORDERBY之后。如果子句的顺序不正确,MySQL将生成一条错误消息。18.什么时候用引号?查询的时候会看到WHERE子句中使用的条件,有的值加单引号,有的值不加。单引号用于分隔字符串,如果该值与字符串类型的列进行比较,则需要分隔引号;而与数值进行比较时,不需要引号。19.WHERE子句中是否需要括号?无论何时使用带有AND和OR运算符的WHERE子句,都应该使用括号来阐明运算顺序。如果条件很多,即使可以确定计算顺序,默认的计算顺序也可能使SQL语句难以理解,所以用括号来明确运算符的顺序是个好习惯。20.更新或删除表时是否必须指定WHERE子句?正如您在前面的章节中看到的,所有UPDATE和DELETE语句都在WHERE子句中指定条件。如果省略WHERE子句,则UPDATE或DELETE将应用于表中的所有行。因此,除非你真的打算更新或删除所有记录,否则要小心使用不带WHERE子句的UPDATE或DELETE语句。建议在更新和删除表之前使用SELECT语句确认要删除的记录,以免造成不可逆的结果。21、索引对数据库性能如此重要,应该如何使用?为数据库选择正确的索引是一项复杂的任务。更少的索引列需要更少的磁盘空间和更少的维护开销。如果在一个大表上创建多个复合索引,索引文件也会膨胀得非常快。另一方面,更多的索引可以覆盖更多的查询。可能需要尝试几种不同的设计以找到最有效的索引。可以在不影响数据库模式或应用程序设计的情况下添加、修改和删除索引。因此,您应该尝试几种不同的索引来构建最佳索引。22、尽量使用短索引。要索引字符串类型的字段,应尽可能指定前缀长度。例如,如果您有一个CHAR(255)列,如果大多数值在前10或30个字符内是唯一的,则不需要索引整个列。短索引不仅可以提高查询速度,还可以节省磁盘空间,减少I/O操作。23.MySQL存储过程和函数有什么区别?它们本质上是存储过程。函数只能通过return语句返回单个值或表对象;而存储过程不允许返回,但是可以通过out参数返回多个值。函数限制较多,不能使用临时表,只能使用表变量,部分函数不可用等;而存储过程的限制相对较少。函数可以嵌入到SQL语句中,在SELECT语句中作为查询语句的一部分被调用;存储过程一般作为一个独立的部分执行。24.存储过程中的代码可以修改吗?目前MySQL不提供对现有存储过程代码的修改。如果必须修改存储过程,则必须使用DROP语句将其删除,然后重写代码,或创建新的存储过程。25、一个存储过程中是否可以调用其他存储过程?存储过程包含一组用户定义的SQL语句。您可以使用CALL语句来调用存储过程。当然也可以在存储过程中使用CALL语句调用其他存储过程,但是不能使用DROP语句删除其他存储过程。26、存储过程的参数不能与数据表中的字段名相同。在定义存储过程参数列表时,要注意区分参数名和数据库表中的字段名,否则会出现意想不到的结果。27.存储过程的参数可以是中文吗?一般情况下,存储过程可以传入中文参数。比如一个存储过程根据用户名查找用户的信息,传入的参数值可能是中文的。这时候在定义存储过程的时候,需要在末尾加上字符集gbk,否则调用存储过程时使用中文参数会出错。例如定义userInfo存储过程,代码如下:1.两者的区别:28.View和MySQL表的区别和联系是什么?(1)视图是经过编译的SQL语句,是根据SQL语句的结果集可视化的表,而表则不是。(2)视图没有实际的物理记录,但基本表有。(3)表是内容,视图是窗口。(4)表占用物理空间而视图不占用物理空间。视图只是一个逻辑概念。表可以及时修改,但是视图只能通过创建的语句进行修改。(5)视图是查看数据表的一种方式。它可以查询数据表中由某些字段组成的数据,这只是一些SQL语句的集合。从安全的角度来看,视图可以防止用户接触数据表,使用户不知道表结构。(6)该表属于全局模式下的表,是真正的表;该视图属于本地模式下的表,是一个虚拟表。(7)视图的建立和删除只影响视图本身,不影响对应的基础表。2、两者的关系:视图(view)是建立在基本表之上的表,它的结构(即定义的列)和内容(即所有记录)都来自于基本表,它基于基本表的存在而存在。一个视图可以对应一个基本表,也可以对应多个基本表。视图是对基表和逻辑意义上建立的新关系的抽象。28.使用触发器时必须特别小心。使用触发器时,需要注意。对于同一张表,同一事件只能创建一个触发器。例如,如果你为表账号创建了一个BEFOREINSERT触发器,那么如果你再次为表账号创建一个BEFOREINSERT触发器,MySQL就会报错。此时,只能在表帐户上创建AFTERINSERT或BEFOREUPDATE触发器。灵活使用触发器会为操作省去很多麻烦。29、及时删除不再需要的触发器。定义触发器后,每次执行触发器事件时,都会激活触发器,并执行触发器中的语句。如果需求发生变化,但触发器没有相应的变化或删除,触发器仍然会执行旧的语句,这会影响新数据的完整性。因此,不再使用的触发器应及时删除。30.创建用户应该用什么方法?创建用户有几种方式:GRANT语句、CREATEUSER语句、直接操作用户表。一般情况下,***使用GRANT或CREATEUSER语句,而不是直接将用户信息插入到user表中,因为user表中存放的是全局级别的权限和其他账户信息。如果用户表中的记录不小心被破坏了,那么可能会对MySQL服务器造成很大的影响。31、mysqldump备份的文件只能在MySQL中使用吗?mysqldump备份的文本文件实际上是数据库的副本。使用该文件,不仅可以恢复MySQL中的数据库,还可以通过简单修改该文件,使用该文件恢复SQLServer或Sybase等其他数据库中的数据库。这在某种程度上启用了数据库之间的迁移。32、如何选择备份工具?直接复制数据文件是最直接快速的备份方式,但缺点是基本不能实现增量备份。您必须确保在备份时这些表未被使用。如果服务器在复制表时正在修改表,则复制无效。备份文件时,最好关闭服务器,然后重新启动服务器。为了保证数据的一致性,需要在备份文件前执行如下SQL语句:就在目录下。mysqlhotcopy是一个PERL程序,它使用LOCKTABLES、FLUSHTABLES和cp或scp来快速备份数据库。是备份数据库或单表最快的方法,但只能和数据库文件在同一台机器上运行,mysqlhotcopy只能用于备份MyISAM表。mysqlhotcopy适用于小型数据库的备份,数据量不大。您可以使用mysqlhotcopy程序每天执行一次完整备份。mysqldump将数据表导入到SQL脚本文件中,比较适合不同MySQL版本之间的升级。这也是最常用的备份方式。mysqldump比直接复制慢。也就是将内存中的数据全部刷新到磁盘中,同时对数据表进行锁定,保证在复制过程中不会写入新的数据。这种方法备份的数据恢复也很简单,直接复制回原来的数据库即可。33、平时应该打开哪些日志?日志既影响MySQL性能又占用大量磁盘空间。因此,如果没有必要,应尽可能少地启用日志记录。根据使用环境的不同,可以考虑开启不同的日志。比如在开发环境中优化查询效率低的语句,可以开启慢查询日志;如果需要记录所有用户查询操作,可以开启通用查询日志;如果需要记录数据变化,可以开启二进制日志;错误日志是默认打开的。34.如何使用二进制日志?二进制日志主要用于记录数据的变化。如果需要记录数据库中的更改,可以启用二进制日志记录。基于二进制日志的特点,它不仅可以用于数据恢复,还可以用于数据复制。在数据库定期备份的情况下,如果发生数据丢失,可以先使用备份恢复大部分数据,然后使用二进制日志恢复最近一次备份后发生变化的数据。在双机热备的情况下,可以使用MySQL的二进制日志来记录数据的变化,然后将变化的部分复制到备份服务器上。35.如何使用慢查询日志?慢查询日志主要用于记录查询时间较长的日志。在开发环境中,可以开启慢查询日志,记录查询时间较长的查询语句,然后对这些语句进行优化。通过配置long_query_time的值,可以灵活掌握不同程度的慢查询语句。36.建索引是不是越多越好?合理的索引可以提高查询速度,但是索引越多越好。执行插入语句时,MySQL需要为新插入的记录创建索引。所以过多的索引会使插入操作变慢。原则上只对用于查询的字段进行索引。37.如何使用查询缓冲区?查询缓冲区可以提高查询速度,但是这种方式只适用于查询语句多,更新语句少的情况。默认情况下,查询缓冲区的大小为0,这意味着它不可用。可以修改queiy_cache_size来调整查询缓冲区大小;修改query_cache_type以调整查询缓冲区类型。修改my.ini中query_cache_size和query_cache_type的值如下:表示开启查询缓冲区。只有在查询语句中包含SQL_NO_CACHE关键字时,才会使用查询缓冲区。您可以使用FLUSHQUERYCACHE语句刷新缓冲区并清除查询缓冲区中的碎片。
