MySQL五个查询优化方法
来源:asp之家 发布时间:2009-08-29 15:05:00
熟悉SQL的人都知道,完成同一个任务,SQL可能有多种写法,但不同写法的查询性能可能会有天壤之别,本文列举出五个查询优化的方法,当然,优化的方法还有很多。
1、优化数据类型
MySQL中数据类型有多种,如果你是一名DBA,正在按照优化的原则对数据类型进行严格的检查,但开发人员可能会选择他们认为最简单的方案,以加快编码速度,或者选择最明显的选择,因此,你可能面临的都不是最佳的选择,如果可能的话,你应该尝试以通用准则来改变这些决定。 IT专家网独家:MySQL存储过程调试
(1)避免使用NULL
NULL对于大多数数据库都需要特殊处理,MySQL也不例外,它需要更多的代码,更多的检查和特殊的索引逻辑,有些开发人员完全没有意识到,创建表时NULL是默认值,但大多数时候应该使用NOT NULL,或者使用一个特殊的值,如0,-1作为默认值。
(2)仅可能使用更小的字段
MySQL从磁盘读取数据后是存储到内存中的,然后使用cpu周期和磁盘I/O读取它,这意味着越小的数据类型占用的空间越小,从磁盘读或打包到内存的效率都更好,但也不要太过执着减小数据类型,要是以后应用程序发生什么变化就没有空间了。修改表将需要重构,间接地可能引起代码的改变,这是很头疼的问题,因此需要找到一个平衡点。MySQL中隐藏空间问题介绍
2、小心字符集转换
客户端或应用程序使用的字符集可能和表本身的字符集不一样,这需要MySQL在运行过程中隐含地进行转换,此外,要确定字符集如UTF-8是否支持多字节字符,因此它们需要更多的存储空间。
3、优化count(my_col)和count(*)
如果你使用MyISAM表,在没有where子句的情况下使用count(*)速度是很快的,因为行数量的统计是非常精确的,因此MySQL不会一行一行地去找,进而得出行数,如my_col列没有空值,那么和前面说的情况会一样,即count(my_col)速度也会很快。
如果有where子句时使用count( ),基本上就无法进行更多优化了,在where子句中超出了明显的索引列,对于复杂的where子句,只有使用覆盖索引才有用。
除了上面的建议外,你还可以使用汇总表,它们让你可以对表的内容保持更新,你可以使用触发器,或者应用程序逻辑保持汇总表总是最新状态,或者定期运行一个批处理作业保持填充最新的数据信息,如果你采用后者,你的信息将会非常接近,但不是精确的,依赖于批处理作业多久运行一次,这需要权衡应用程序对精确信息的需要,和保持数据更新的系统开销,要在这二者之间找到一个平衡点。
4、优化子查询
遇到子查询时,MySQL的查询优化引擎并不是总是最有效的,这就是为什么经常将子查询转换为连接查询的原因了,优化器已经能够正确处理连接查询了,当然要注意的一点是,确保连接表(第二个表)的连接列是有索引的,在第一个表上MySQL通常会相对于第二个表的查询子集进行一次全表扫描,这是嵌套循环算法的一部分。
5、优化UNION
在跨多个不同的数据库时使用UNION是一个有趣的优化方法,UNION从两个互不关联的表中返回数据,这就意味着不会出现重复的行,同时也必须对数据进行排序,我们知道排序是非常耗费资源的,特别是对大表的排序。
UNION ALL可以大大加快速度,如果你已经知道你的数据不会包括重复行,或者你不在乎是否会出现重复的行,在这两种情况下使用UNION ALL更适合。此外,还可以在应用程序逻辑中采用某些方法避免出现重复的行,这样UNION ALL和UNION返回的结果都是一样的,但UNION ALL不会进行排序。
小结
虽然本文列举的优化方法并不完全,但无论何时,只要可能,尽可能尝试不同的解决方案,查看查询计划,在大数据集上进行测试,并会定位结果基准点,观察在实际应用中的情况怎么样。同时,事先查看一下你的慢速查询日志,尽可能早地找出需要调整的查询。
猜你喜欢
- 代码如下:declare @Q_ID uniqueidentifier set @Q_ID = dbo.uf_GetParamValueBy
- 【原文地址】Tip/Trick: Url Rewriting with ASP.NET 【原文发表日期】 Monday, February
- Asp中Server.ScriptTimeOut属性需要注意的一点Server.ScriptTimeout 这个属性给定Asp脚
- 刚才运行了一段代码,来查看Request.ServerVariables里面有多少值,看了一下,共50个!代码<%=Request.S
- 当然是可以的,而且非常简单,今天就教大家在ASP中不用模板生成HTML静态页的方法。这里假设有一个htmer.asp动态页面,你想把它生成为
- 这篇论坛文章(赛迪网技术社区)主要介绍了配置一个高可用性的MySQL服务器负载均衡群集的具体过程,详细内容请参考下文:本文将告诉你如何配置一
- 今天的问题是请问以下 alert 弹出值分别是什么?var f = function f2()&nb
- 在浏览几个网页时,发现有几个网站在显示时间时存在问题,比如今天是2009年1月4日,但是有的网站上却赫然写着今天是109年1月4日(这里有个
- 一空间多域名绑定3种方法,HTML代码格式:<html> <script language=javascript
- 1、应该将 CSS 放置于结构的上方(一般放置于 head 元素内)。CSS 是解释型语言,Firefox 和 IE 在等待 CSS 传输完
- 从MySQL 5.0 开始,支持了一个全新的SQL句法:PREPARE stmt_name FROM preparable_stmt;EXE
- 利用系统crontab来定时执行备份文件,按日期对备份结果进行保存,达到备份的目的。1、创建保存备份文件的路径/mysqldata#mkdi
- 有过Web经验的人喜欢使用:<meta http-equiv="refresh" content="1;
- 先谈一下面包屑的由来:很久很久以前,在大森林的边上住着一个贫穷的樵夫,他妻子和两个孩子与他相依为命。他的儿子名叫汉赛尔,女儿名叫格莱特。后来
- 一、介绍QQ空间相册的个性化利器,能对照片进行效果的优化、文字编辑等等。从设计上使用了创新的手法,尽量减少用户的思考。其中,通过界面的特殊表
- TeX 排版中文字体嵌入问题,兼谈不拘小节的中文字体设计原文:http://yulewang.spaces.live.com/blog/cn
- SQL中的单记录函数 1.ASCII 返回与指定的字符对应的十进制数; SQL> select ascii('A')
- 我的机器不知为何,安装MySQL的时候,一到配置那一步就无休止的等待,只好结束任务,然而启动MySQL的时候出现1067错误提示
- 本文介绍了使用XMlhttp技术来生成html页面,值得借鉴。相关函数:<% ’定义xmlhttp funct
- 使用ASP做网站虽然有点落伍,但在中国还是有很大市场的,因为大部分国内用户使用Windows Server服务器,在Windows Serv