从四个细节出发做好MySQL查询优化

   众所周知,在任何一个数据库中,查询优化都是不可避免的一个话题。对于数据库工程师来说,优化工作是最有挑战性的工作。MySQL开源数据库也不例外。其实笔者认为,数据库优化并没有大家所想象的那么苦难。通常情况下,大家可以从以下四个细节出发来做好MySQL数据库的查询优化工作。

  一、利用EXPLAIN关键字来评估查询语句中的缺陷

  如下图所示,现在笔者在数据库中执行了一条简单的Select查询语句,从一个表格中查询所有信息。现在数据库管理员想知道,数据库在执行这条语句时,做了哪些工作?或者说想知道,这条查询语句有没有进一步优化的可能。如果要了解这个信息的话,就可以在查询语句中加入一个Explain关键字。

  


  通过Select查询语句可以从数据库中查询某个表中的数据。但是这条语句执行的效率如何?是否还有优化的余地?这些内容是无法从上面这个简单的查询语句中获得的。为了了解更加详细的信息,需要加入Explain关键字。如下图所示:

  


  加入Explain关键字之后,系统并没有查询出表格中的数据,而只是显示了查询过程中的一些信息。这些信息对于我们后续进行数据库查询优化非常有帮助。从上面这个信息中我们可以看出,用户只是进行来一个简单的查询。在这个查询中,没有用到任何索引、关键字等内容,也没有用到Where条件语句。为此这个查询语句并不是很合理。虽然其可以找到最后正确的结果,不过其查询效率可能并不是很明显。为此数据库专家可以根据上面显示的信息来进行优化。如果我们现在在查询语句中加入一条Where语句,那么又会有什么样的结果呢?如下图所示。

  


  此时在最后一个Extra字段中,系统就会显示已经使用了Where语句。在进行数据库优化中,我们需要抓住结果中的NULL字段或者空白内容的字段。这些地方往往是我们进行优化的重点。如上图所示,我们可以给这条Select语句进行如下的优化:在表中设置关键字或者索引,来提高查询的效率。

  二、数据比较时采用相同类型的列以提高查询效率

  在数据查询时,有时候会在条件语句中加入判断的条件。如现在有两张表:用户基本信息表和用户权限表,两者通过用户编号作为关联。现在需要查询出每个用户对应什么样的权限,此时就要通过用户编号作为查询条件来进行查询。现在假设用户基本信息表中的用户编号字段为CHAR类型的;而用户权限表中的用户编号是VARCHAR类型的。这两个数据类型虽然都是字符型,但是不是同一种类型。现在对这连个表执行关联查询,其查询的效率如何呢?首先需要确定的一点是,虽然他们两个是不同类型的字符型数据,不过是相互兼容的。最后仍然可以得到正确的结果。明确了这一点之后,我们再来考虑,能否对这个查询语句进行优化呢?

  我们再假设一下。现在这两个表的用户编号的数据类型都是CHAR。现在再对这两个表进行关联查询,得到的结果是否相同呢?我们测试的结果是,查询的结果是相同的,但是其所花费的时间是不同的。而且随着数据量的增加,两个查询所相差的时间会越来越长。从这里可以知道,虽然这两个查询语句是等价的,但是其查询的效率不同。

  在MySQL数据库中,虽然相互兼容的数据类型可以进行相互比较。但是其查询的效率会有所影响。从提高数据库查询效率的角度出发,笔者建议在查询条件语句中最好比较具有相同类型的列。在同等条件下,相同的列类型比不同类型的列能够提供更好的性能。特别是在数据量比较多的数据库中,这尤其重要。

  不过这个优化需要涉及到数据表的列类型。为此在数据表进行设计时,就需要考虑这一点。如针对上面这个案例,我们可以在两个表中专门设置一个用户ID列。可以使用整数类型的序列,让系统进行自动编号。然后在查询时通过这个用户ID列来进行比较,而不是通过原来的用户编号列进行比较。相对来说,这么操作查询的效率会更高。

  三、在Like关键字的起始处通配符要谨慎使用

  在实际工作中,笔者发现不少数据库管理员有一个不好的习惯。他们在使用Like等关键字时,通配符会乱用。如现在用户需要查找所有以“LOOK”为前缀的产品信息。用户在查询时,会习惯性的使用下面的语句进行查询:like “%LOOK%”。这个条件语句会查询出所有品名中有LOOK这个单词的纪录,而不是查询出以LOOK为前缀的产品信息。

  虽然最终的结果可能是相同的。但是两者的查询效率不同。其实这很大一部分原因是客户端应用程序设计不当所造成的。如在客户端应用程序设计时,系统会默认显示一个%符号。如下图所示。

  


  这么设计的本意是好的,让系统能够支持模糊查询。但是用户在实际操作起来,就可以有问题。如用户在查询时,不会在%号前面输入LOOK这个单词,而是在%后面输入LOOK这个单词。因为在查询时,光标会自动定位到%号后面。通常情况下,用户在输入时不会再去调整光标的位置。此时就出现了上面所说的这种情况。

  为此笔者建议,在Like等关键字后面如果需要用到通配符的话,要非常的谨慎。特别是从大量数据中查找纪录时,这个通配符的位置一定要用对地方。在起始处能够不同通配符的话,尽量不要使用通配符。

  四、尽量使用其它形式来代替Like关键字

  上面提到在使用Like关键字时需要注意通配符的位置。其实从查询效率来看,我们不仅需要注意通配符的位置,而且能够不用Like关键字最好就不用。其实在SQL语句中,可以利用其他方式来代替Like关键字。如现在有一个产品表,其编号为6位。现在需要查询以9开头的产品编号。这该怎么操作呢?

  一是可以通过使用Like关键字,如LIKE “9%”。注意这个通配符的位置。这个条件语句可以查到所需要的结果。但是从性能优化的角度看,这条语句不是很好的处理方式。我们还可以通过一些折中的方式来实现。

  二是通过比较符号来实现。如可以使用Value>=900000 and Value<=999999这种方式来实现。虽然两者的查询的结果是相同的。但是查询的时间这条语句要比上面这个采用Like符号的语句要短的多。

时间: 2024-12-21 18:55:22

从四个细节出发做好MySQL查询优化的相关文章

做好四个细节让你的站内文章达到秒收的境界

相信每一位站长都恨不得自己的网站被百度收录得越多越好,越快越好,甚至希望达到"秒收"的境界.但是真正能做到被"秒收"的网站并不多,大部分网站都处于收录慢.收录少的尴尬境况,不少站长都很苦恼,每天用心.规律地更新站内文章,为何收录还是如此不给力? 百度对站内文章都会有它特定的评价标准,笔者也从中和一些优化老手研究探讨过,什么样的文章才是百度想要的.通过实践和验证,笔者也简单地总结了一套规律,想要达到秒收就要做好四个细节,那究竟是哪四个细节呢? 细节一:主题要符合网站类

SEOer做好四个细节使新站在24小时内收录

做seo也有几年时间了,但是也经常在光顾各大站长论坛,发现还是有很多朋友不能掌握如何让百度快速的收录,今天我在这里交大家几个步骤让新站快速的被百度收录,这个方法我用了是没有问题,如果今天上午做的站我下午就会收录进去,一般在5个小时收录.我把方法介绍出来,怎么做要看大家自己的执行能力了. 第一个细节:网站的空间,网站的空间一定要稳定,我这里面指的稳定是指空间的速度不能忽快忽慢的,很多朋友做网站买的都是虚拟的主机,现在又有很多朋友做网站内容直接采集,这样会影响整个服务器的速度,说不定跟你一个服务器里

谈谈提升用户体验须做好的四个细节优化

摘要: 外贸网站优化最终的目的就是为了让用户体验更加的良好,使外贸网站的存在更具价值.而这一切都需要通过用户的投票来判断的.况且决定外贸网站前途的是用户,当用户在外贸网站 外贸网站优化最终的目的就是为了让用户体验更加的良好,使外贸网站的存在更具价值.而这一切都需要通过用户的投票来判断的.况且决定外贸网站前途的是用户,当用户在外贸网站中得到理想的体验访问度时,自然就对外贸网站产生一种喜欢的心理.而且这也是让用户进行再次回访的有力保障.所以说,外贸网站SEO优化其实就是为了用户体验而活的,那么对于外

php+mysql查询优化简单实例

 这篇文章主要介绍了php+mysql查询优化简单实例,分析了php+mysql程序设计中关于SQL语句优化查询的技巧,对于提高查询效率有一定参考借鉴价值,需要的朋友可以参考下     本文实例分析了php+mysql查询优化的方法.分享给大家供大家参考.具体分析如下: PHP+Mysql是一个最经常使用的黄金搭档,它们俩配合使用,能够发挥出最佳性能,当然,如果配合Apache使用,就更加Perfect了. 因此,需要做好对mysql的查询优化,下面通过一个简单的例子,展现不同的SQL语句对于查

mysql查询优化,谁能帮我优化查询啊?我这个太慢了,慢死了

问题描述 mysql查询优化,谁能帮我优化查询啊?我这个太慢了,慢死了 SELECT mobileuserid,caozuoleixing,caozuozhi,xiguanzhi FROM 表A WHERE xiguanzhi>2 GROUP BY mobileuserid,caozuoleixing,caozuozhi,xiguanzhi ORDER BY mobileuserid,caozuoleixing,xiguanzhi DESC LIMIT 3000 解决方案 SELECT dist

数据库优化-java操作mysql 查询优化问题

问题描述 java操作mysql 查询优化问题 本人刚入门数据库 目前这个问题就是 我现在有一个表 大概600万到1000万左右的数据 字段只有两个 一个id 主键 另一个word varchar类型 我现在需要在表中搜索word 然后看到他返回了多少条信息 不需要内容 我sql语句是这样的 select word from wordidf where word="北京" 但是速度奇慢无比 我一开始分析的时候感觉是程序问题 但是在navicat里面也是特别慢 我知道600万的数据对于m

MySql查询优化方法总结

常用查询优化 1: max()优化: 在相应列上添加索引 2: count()优化:count(*) 会算出包含null记录的数量, count(field_name)只包含不含 null的数量(这也是很多时候两种count方式结果不一致的原因), count()的时候尽量用后一种, count(null)返回0,即不会记录null记录数量 3: 子查询优化=====>(改为)联接查询(如果1对多的关系,注意重复记录) 4: group by优化 如果包含子查询,在子查询里面使用where条件和

爱问网络浅谈博客SEO运营需要特别注意的四个细节

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 爱问网络从事网络推广已经有4年多了,网络推广中SEO是一个重要的工作,大家都知道网站的优化外链是很重要,都在寻求高质量的外链资源,爱问网络推荐博客,因为好的博客可以给你带来长久的外链资源,甚至会直接影响网络推广的效果.说到运用博客来做外链,很多人都说这个都做烂了,现在博客很难做,有这样想法的人,爱问网络感觉是因为没有创新和没有注意细节. 博客

MySQL查询优化程序

    4.2 MySQL查询优化程序    在发布一个选择行的查询时, MySQL进行分析,看是否能够对它进行优化,使它执行更快.本节中,我们将研究查询优化程序怎样工作.更详细的信息,可参阅MySQL参考指南中的"Getting Maximum Performance from MySQL",该章描述了MySQL采用的各种优化措施.该章中的信息会不断变化,因为MySQL的开发者不断对优化程序进行改进,因此,有必要经常拜访一下该章,看看是否有可供利用的新技巧.(http://www.m