- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
高级数据库技术——期末论文
基于 SQL查询的 MySQL数据库性能优化研究
姓名: XX
学号 :2014XXXXX
学院:计算机学院
摘要:
查询是数据库系统中最基本也是最常用的一种操作, 是否具有较快的执行速
度,已成为数据库用户和设计者极其关心的问题。在研究开源数据库管理系统
MySQL查询优化技术的基础上,主要结合传统 SQL操作优化、深度分析 MySQL
源代码、现代数据库发展几方面进行诸如参数调优, MySQL关联查询,重写相关
规则等内容展开优化分析研究。
关键词: 查询优化,查询重用,查询重写,计划优化
一、传统 SQL查询优化操作
选取最适用的字段属性
MySQL可以很好的支持大数据量的存取, 但是一般说来,数据库中的表越小,
在它上面执行的查询也就会越快。 因此,在创建表的时候,为了获得更好的性能,
我们可以将表中字段的宽度设得尽可能小。例如,在定义邮政编码这个字段时,
如果将其设置为 CHAR(255),显然给数据库增加了不必要的空间,甚至使用
VARCHAR这种类型也是多余的, 因为 CHAR(6)就可以很好的完成任务了。 同样的,
如果可以的话,我们应该使用 MEDIUMINT而不是 BIGIN 来定义整型字段。
另外一个提高效率的方法是在可能的情况下,应该尽量把字段设置为 NOT
NULL,这样在将来执行查询的时候,数据库不用去比较 NULL值。
对于某些文本字段,例如“省份”或者“性别”,我们可以将它们定义为
ENUM类型。因为在 MySQL中, ENUM类型被当作数值型数据来处理,而数值型数
据被处理起来的速度要比文本类型快得多。 这样,我们又可以提高数据库的性能。
2. 使用连接(
JOIN)来代替子查询
(Sub-Queries)
MySQL从
4.1
开始支持
SQL的子查询。这个技术可以使用
SELECT语句来创
建一个单列的查询结果, 然后把这个结果作为过滤条件用在另一个查询中。 例如,
我们要将客户基本信息表中没有任何订单的客户删除掉, 就可以利用子查询先从
销售信息表中将所有发出订单的客户 ID 取出来,然后将结果传递给主查询,如
下所示:
DELETE FROM customerinfo
WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo )
使用子查询可以一次性的完成很多逻辑上需要多个步骤才能完成的 SQL操
作,同时也可以避免事务或者表锁死, 并且写起来也很容易。 但是,有些情况下,
子查询可以被更有效率的连接( JOIN) .. 替代。例如,假设我们要将所有没有
订单记录的用户取出来,可以用下面这个查询完成:
SELECT * FROM customerinfo
WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo )
如果使用连接( JOIN).. 来完成这个查询工作,速度将会快很多。尤其是
当 salesinfo 表中对 CustomerID 建有索引的话,性能将会更好,查询如下:
SELECT * FROM customerinfo
LEFT JOIN salesinfo ON customerinfo.CustomerID=salesinfo.CustomerID
WHERE salesinfo.CustomerID IS NULL
连接( JOIN).. 之所以更有效率一些,是因为 MySQL不需要在内存中创建临
时表来完成这个逻辑上的需要两个步骤的查询工作。
使用联合 (UNION)来代替手动创建的临时表
MySQL从 4.0 的版本开始支持 UNION 查询,它可以把需要使用临时表的两
条或更多的 SELECT 查询合并在一个查询中。在客户端的查询会话结束的时候,
临时表会被自动删除,从而保证数据库整齐、高效。使用 UNION 来创建查询的
时候,我们只需要用 UNION作为关键字把多个 SELECT 语句连接起来就可以了,
要注意的是所有 SELECT 语句中的字段数目要相同。 通过以下例子演示一个使用
UNION的查询。
SELECT Name, Phone FROM client
UNION
SELECT Name, BirthDate FROM author
UNION
SELECT Name, Supplier FROM product
事务
尽管我们可以使用子查询( Sub-Queries )、连接( JOIN)和联合( UNION)
来创建各种各样的查询,但不是所有的数据库操作都可以只用一条或少数几条
SQL语句就可以完成的。更多的时候是需要用到一系列的语句来完成某种工作。
但是在这种情况
文档评论(0)