前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关系型数据库 MySQL 你不知道的 28 个小技巧

关系型数据库 MySQL 你不知道的 28 个小技巧

作者头像
JiekeXu之路
发布2019-06-19 19:14:40
1.7K0
发布2019-06-19 19:14:40
举报
文章被收录于专栏:JiekeXu之路JiekeXu之路
无论是运维、开发、测试,还是架构师,数据库技术是一个必备加薪神器,那么,一直说学习数据库、学 MySQL,到底是要学习它的哪些东西呢?
0、如何快速掌握 MySQL?

培养兴趣 兴趣是最好的老师,不论学习什么知识,兴趣都可以极大地提高学习效率。当然学习 MySQL5.6 也不例外。

夯实基础 计算机领域的技术非常强调基础,刚开始学习可能还认识不到这一点,随着技术应用的深 入,只有有着扎实的基础功底,才能在技术的道路上走得更快、更远。对于 MySQL 的学习来说, SQL 语句是其中最为基础的部分,很多操作都是通过 SQL 语句来实现的。所以在学习的过程中, 读者要多编写 SQL 语句,对于同一个功能,使用不同的实现语句来完成,从而深刻理解其不同之处。

及时学习新知识 正确、有效地利用搜索引擎,可以搜索到很多关于 MySQL5.6 的相关知识。同时,参考别 人解决问题的思路,也可以吸取别人的经验,及时获取最新的技术资料。

多实践操作 数据库系统具有极强的操作性,需要多动手上机操作。在实际操作的过程中才能发现问题, 并思考解决问题的方法和思路,只有这样才能提高实战的操作能力。

1、MySQL中如何使用特殊字符?

诸如单引号(’),双引号("),反斜线()等符号,这些符号在 MySQL 中不能直接输入 使用,否则会产生意料之外的结果。在MySQL中,这些特殊字符称为转义字符,在输入时需要 以反斜线符号(’’)开头,所以在使用单引号和双引号时应分别输入(’)或者("),输入反 斜线时应该输入(),其他特殊字符还有回车符( ),换行符( ),制表符( ab ),退格 符()等。在向数据库中插入这些特殊字符时,一定要进行转义处理。

2、MySQL中可以存储文件吗?

MySQL 中的 BLOB 和 TEXT 字段类型可以存储数据量较大的文件,可以使用这些数据类型 存储图像、声音或者是大容量的文本内容,例如网页或者文档。虽然使用 BLOB 或者 TEXT 可 以存储大容量的数据,但是对这些字段的处理会降低数据库的性能。如果并非必要,可以选择只 储存文件的路径。

3、MySQL中如何执行区分大小写的字符串比较?

在 Windows 平台下,MySQL 是不区分大小的,因此字符串比较函数也不区分大小写。如果 想执行区分大小写的比较,可以在字符串前面添加 BINARY 关键字。例如默认情况下,’a’=‘A’ 返回结果为 1,如果使用 BINARY 关键字,BINARY’a’=‘A’ 结果为 0,在区分大小写的情况下,’a’ 与 ’A’ 并不相同。

4、如何从日期时间值中获取年、月、日等部分日期或时间值?

MySQL 中,日期时间值以字符串形式存储在数据表中,因此可以使用字符串函数分别截取日期时间值的不同部分,例如某个名称为 dt 的字段有值 “2010-10-01 12:00:30”,如果只需要获 得年值,可以输入 LEFT(dt, 4),这样就获得了字符串左边开始长度为 4 的子字符串,即 YEAR 部分的值;如果要获取月份值,可以输入 MID(dt,6,2),字符串第 6 个字符开始,长度为 2 的子字符串正好为 dt 中的月份值。同理,读者可以根据其他日期和时间的位置,计算并获取相应的值。

5、如何改变默认的字符集?

CONVERT() 函数改变指定字符串的默认字符集,在开始的章节中,向读者介绍使用 GUI 图形化安装配置工具进行 MySQL 的安装和配置,其中的一个步骤是可以选择 MySQL 的默认字符集。但是,如果只改变字符集,没有必要把配置过程重新执行一遍,在这里,一个简单的方式是 修改配置文件。在 Windows 中,MySQL 配置文件名称为 my.ini,该文件在 MySQL 的安装目录下面。修改配置文件中的 default-character-set 和 character-set-server 参数值,将其改为想要的字 符集名称,如 gbk、gb2312、latinl 等,修改完之后重新启动 MySQL 服务,即可生效。读者可以在修改字符集时使用 SHOW VARIABLES LIKE ’character_set_°%’; 命令查看当前字符集,以进行对比。

6、DISTINCT 可以应用于所有的列吗?

查询结果中,如果需要对列进行降序排序,可以使用 DESC,这个关键字只能对其前面的列 进行降序排列。例如,要对多列都进行降序排序,必须要在每一列的列名后面加 DESC关键字。 而DISTINCT 不同,DISTINCT 不能部分使用。换句话说,DISTINCT 关键字应用于所有列而不仅是它后面的第一个指定列。例如,查询 3 个字段 s_id,f_name,f_price,如果不同记录的这 3 个字段的组合值都不同,则所有记录都会被查询出来。

7、ORDER BY 可以和 LIMIT 混合使用吗?

在使用 ORDER BY 子句时,应保证其位于 FROM 子句之后,如果使用 LIMIT,则必须位 于ORDER BY 之后,如果子句顺序不正确,MySQL 将产生错误消息。

8、什么时候使用引号?

在查询的时候,会看到在 WHERE 子句中使用条件,有的值加上了单引号,而有的值未加。 单引号用来限定字符串,如果将值与字符串类型列进行比较,则需要限定引号;而用来与数值进 行比较则不需要用引号。

9、在 WHERE子 句中必须使用圆括号吗?

任何时候使用具有 AND 和 OR 操作符的 WHERE 子句,都应该使用圆括号明确操作顺序。 如果条件较多,即使能确定计算次序,默认的计算次序也可能会使 SQL 语句不易理解,因此使 用括号明确操作符的次序,是一个好的习惯。

10、更新或者删除表时必须指定 WHERE子 句吗?

在前面章节中可以看到,所有的 UPDATE 和 DELETE 语句全都在 WHERE 子句中指定了条 件。如果省略 WHERE 子句,则 UPDATE 或 DELETE 将被应用到表中所有的行。因此,除非 确实打算更新或者删除所有记录,否则要注意使用不带 WHERE 子句的 UPDATE 或 DELETE 语句。建议在对表进行更新和删除操作之前,使用 SELECT 语句确认需要删除的记录,以免造 成无法挽回的结果。

11、索引对数据库性能如此重要,应该如何使用它?

为数据库选择正确的索引是一项复杂的任务。如果索引列较少,则需要的磁盘空间和维护开销 都较少。如果在一个大表上创建了多种组合索引,索引文件也会膨胀很快。而另一方面,索引较多 可覆盖更多的查询。可能需要试验若干不同的设计,才能找到最有效的索引。可以添加、修改和删 除索引而不影响数据库架构或应用程序设计。因此,应尝试多个不同的索引从而建立最优的索引。

12、尽量使用短索引。

对字符串类型的字段进行索引,如果可能应该指定一个前缀长度。例如,如果有一个 CHAR(255)的列,如果在前 10 个或 30 个字符内,多数值是惟一的,则不需要对整个列进行索引。 短索引不仅可以提高查询速度而且可以节省磁盘空间、减少 I/O 操作。

13、MySQL 存储过程和函数有什么区别?

在本质上它们都是存储程序。函数只能通过 return 语句返回单个值或者表对象;而存储过程 不允许执行 return,但是可以通过 out 参数返回多个值。函数限制比较多,不能用临时表,只能用表变量,还有一些函数都不可用等等;而存储过程的限制相对就比较少。函数可以嵌入在 SQL 语句中使用,可以在 SELECT 语句中作为查询语句的一个部分调用;而存储过程一般是作为一个独立的部分来执行。

14、存储过程中的代码可以改变吗?

目前,MySQL 还不提供对已存在的存储过程代码的修改,如果必须要修改存储过程,必须使用 DROP 语句删除之后,再重新编写代码,或者创建一个新的存储过程。

15、存储过程中可以调用其他存储过程吗?

存储过程包含用户定义的 SQL 语句集合,可以使用 CALL 语句调用存储过程,当然在存储 过程中也可以使用 CALL 语句调用其他存储过程,但是不能使用 DROP 语句删除其他存储过程。

16、存储过程的参数不要与数据表中的字段名相同。

在定义存储过程参数列表时,应注意把参数名与数据库表中的字段名区别开来,否则将出 现无法预期的结果。

17、存储过程的参数可以使用中文吗?

一般情况下,可能会出现存储过程中传入中文参数的情况,例如某个存储过程根据用户的 名字查找该用户的信息,传入的参数值可能是中文。这时需要在定义存储过程的时候,在后面加 上 character set gbk,不然调用存储过程使用中文参数会出错,比如定义 userInfo 存储过程,代码 如下:

代码语言:javascript
复制
CREATE PROCEDURE useInfo(IN u_name VARCHAR(50) character set gbk, OUT u_age INT)

18、MySQL 中视图和表的区别以及联系是什么?

两者的区别:

  • (1)视图是已经编译好的 SQL 语句,是基于 SQL 语句的结果集的可视化的表,而表不是。
  • (2)视图没有实际的物理记录,而基本表有。
  • (3)表是内容,视图是窗口。
  • (4)表占用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时对它 进行修改,但视图只能用创建的语句来修改。
  • (5)视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL 语句的集合。从安全的角度来说,视图可以防止用户接触数据表,因而用户不知道表结构。
  • (6)表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表。
  • (7)视图的建立和删除只影响视图本身,不影响对应的基本表。

两者的联系:

  • 视图(view)是在基本表之上建立的表,它的结构(即所定义的列)和内容(即所有记录) 都来自基本表,它依据基本表存在而存在。
  • 一个视图可以对应一个基本表,也可以对应多个基本 表。
  • 视图是基本表的抽象和在逻辑意义上建立的新关系。
19、使用触发器时须特别注意。

在使用触发器的时候需要注意,对于相同的表,相同的事件只能创建一个触发器,比如对 表 account 创建了一个 BEFORE INSERT触发器,那么如果对表 account 再次创建一个 BEFORE INSERT 触发器,MySQL 将会报错,此时,只可以在表 account上创建 AFTER INSERT 或者 BEFORE UPDATE 类型的触发器。灵活的运用触发器将为操作省去很多麻烦。

20、及时删除不再需要的触发器。

触发器定义之后,每次执行触发事件,都会激活触发器并执行触发器中的语句。如果需求 发生变化,而触发器没有进行相应的改变或者删除,则触发器仍然会执行旧的语句,从而会影响 新的数据的完整性。因此,要将不再使用的触发器及时删除。

21、应该使用哪种方法创建用户?

创建用户有几种方法:GRANT 语句、CREATE USER 语句和直接操作 user 表。一般情况, 最好使用 GRANT 或者 CREATE USER 语句,而不要直接将用户信息插入 user 表,因为 user 表中存储了全局级别的权限以及其他的账户信息,如果意外破坏了 user 表中的记录,则可能会对 MySQ L服务器造成很大影响。

22、mysqldump 备份的文件只能在 MySQL 中使用吗?

mysqldump 备份的文本文件实际是数据库的一个副本,使用该文件不仅可以在 MySQL 中恢 复数据库,而且通过对该文件的简单修改,可以使用该文件在 SQL Server 或者 Sybase 等其他数 据库中恢复数据库。这在某种程度上实现了数据库之间的迁移。

23、如何选择备份工具?

直接复制数据文件是最为直接、快速的备份方法,但缺点是基本上不能实现增量备份。备 份时必须确保没有使用这些表。如果在复制一个表的同时服务器正在修改它,则复制无效。备份 文件时,最好关闭服务器,然后重新启动服务器。为了保证数据的一致性,需要在备份文件前, 执行以下 SQL 语句:

代码语言:javascript
复制
CREATE PROCEDURE useInfo(IN u_name VARCHAR(50) character set gbk, OUT u_age INT)

以上原文语法但感觉有误,已无法验证,借此机会说一句,MySQL5.7 备份工具除了 mysqldump 还可选择 mydumper,当然要是裸设备还可以选择 XtraBackup 工具。

mysqlhotcopy 是一个 PERL 程序,它使用 LOCK TABLES、FLUSH TABLES 和 cp 或 scp 来快速备份数据库。它是备份数据库或单个表的最快的途径,但它只能运行在数据库文件所在的 机器上,并且 mysqlhotcopy 只能用于备份 MyISAM 表。mysqlhotcopy 适合于小型数据库的备份, 数据量不大,可以使用 mysqlhotcopy 程序每天进行一次完全备份。mysqldump 将数据表导成 SQL 脚本文件,在不同的 MySQL 版本之间升级时相对比较合适, 这也是最常用的备份方法。mysqldump 比直接复制要慢些。也就是把内存中的数据都刷新到磁盘中,同时锁定数据表,以保证复制过程中不会有新的 数据写入。这种方法备份出来的数据恢复也很简单,直接复制回原来的数据库

24、平时应该打开哪些日志?

日志既会影响 MySQL 的性能,又会占用大量磁盘空间。因此,如果不必要,应尽可能少地 开启日志。根据不同的使用环境,可以考虑开启不同的日志。例如,在开发环境中优化查询效率 低的语句,可以开启慢查询日志;如果需要记录用户的所有查询操作,可以开启通用查询日志; 如果需要记录数据的变更,可以开启二进制日志;错误日志是默认开启的。

25、如何使用二进制日志?

二进制日志主要用来记录数据变更。如果需要记录数据库的变化,可以开启二进制日志。 基于二进制日志的特性,不仅可以用来进行数据恢复,还可用于数据复制。在数据库定期备份的 情况下,如果出现数据丢失,可以先用备份恢复大部分数据,然后使用二进制日志恢复最近备份 后变更的数据。在双机热备情况下,可以使用 MySQL 的二进制日志记录数据的变更,然后将变 更部分复制到备份服务器上。

26、如何使用慢查询日志?

慢查询日志主要用来记录查询时间较长的日志。在开发环境下,可以开启慢查询日志来记 录查询时间较长的查询语句,然后对这些语句进行优化。通过配 long_query_time 的值,可以灵活地掌握不同程度的慢查询语句。

27、是不是索引建立得越多越好?

合理的索引可以提高查询的速度,但不是索引越多越好。在执行插入语句的时候,MySQL 要为新插入的记录建立索引。所以过多的索引会导致插入操作变慢。原则上是只有查询用的字段 才建立索引。

28、如何使用查询缓冲区?

查询缓冲区可以提高查询的速度,但是这种方式只适合查询语句比较多、更新语句比较少 的情况。默认情况下查询缓冲区的大小为 〇,也就是不可用。可以修改 queiy_cache_size 以调整 查询缓冲区大小;修改 query_cache_type 以调整查询缓冲区的类型。在 my.ini 中修改 query_cache_size 和 query_cache_type 的值如下所示:

代码语言:javascript
复制
[mysqld]
query_cache_size= 512M query_cache_type= 1
query_cache_type=1

表示开启查询缓冲区。只有在查询语句中包含 SQL_NO_CACHE 关键字 时,才不会使用查询缓冲区。可以使用 FLUSH QUERY CACHE 语句来刷新缓冲区,清理查询缓冲区中的碎片。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JiekeXu之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 无论是运维、开发、测试,还是架构师,数据库技术是一个必备加薪神器,那么,一直说学习数据库、学 MySQL,到底是要学习它的哪些东西呢?
  • 0、如何快速掌握 MySQL?
  • 1、MySQL中如何使用特殊字符?
  • 2、MySQL中可以存储文件吗?
  • 3、MySQL中如何执行区分大小写的字符串比较?
  • 4、如何从日期时间值中获取年、月、日等部分日期或时间值?
  • 5、如何改变默认的字符集?
  • 6、DISTINCT 可以应用于所有的列吗?
  • 7、ORDER BY 可以和 LIMIT 混合使用吗?
  • 8、什么时候使用引号?
  • 9、在 WHERE子 句中必须使用圆括号吗?
  • 10、更新或者删除表时必须指定 WHERE子 句吗?
  • 11、索引对数据库性能如此重要,应该如何使用它?
  • 12、尽量使用短索引。
  • 13、MySQL 存储过程和函数有什么区别?
  • 14、存储过程中的代码可以改变吗?
  • 15、存储过程中可以调用其他存储过程吗?
  • 16、存储过程的参数不要与数据表中的字段名相同。
  • 17、存储过程的参数可以使用中文吗?
  • 19、使用触发器时须特别注意。
  • 20、及时删除不再需要的触发器。
  • 21、应该使用哪种方法创建用户?
  • 22、mysqldump 备份的文件只能在 MySQL 中使用吗?
  • 23、如何选择备份工具?
  • 24、平时应该打开哪些日志?
  • 25、如何使用二进制日志?
  • 26、如何使用慢查询日志?
  • 27、是不是索引建立得越多越好?
  • 28、如何使用查询缓冲区?
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档