您现在的位置是:首页 > 个人博客日记 个人博客日记

4个MySQL性能优化要点解析

2019-05-22 11:00:57

4个MySQL性能优化要点解析

1、为查询优化你的查询
大多数的MySQL服务器都开启了查询缓存。这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的。当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一个缓存中,这样,后续的相同的查询就不用操作表而直接访问缓存结果了。
这里最主要的问题是,对于程序员来说,这个事情是很容易被忽略的。因为,我们某些查询语句会让MySQL不使用缓存。请看下面的示例:

  1. // 查询缓存不开启
  2. $r = mysql_query("SELECT username FROM user WHERE signup_date >= CURDATE()");
  3. // 开启查询缓存
  4. $today = date("Y-m-d");
  5. $r = mysql_query("SELECT username FROM user WHERE signup_date >= '$today'");

上面两条SQL语句的差别就是 CURDATE() ,MySQL的查询缓存对这个函数不起作用。所以,像 NOW() 和 RAND() 或是其它的诸如此类的SQL函数都不会开启查询缓存,因为这些函数的返回是会不定的易变的。所以,你所需要的就是用一个变量来代替MySQL的函数,从而开启缓存。

2、EXPLAIN 你的SELECT查询

使用EXPLAIN关键字可以让你知道MySQL是如何处理你的SQL语句的。
有表关联的查询,如下列:

  1. select username, group_name from users u joins groups g on (u.group_id = g.id)

发现查询缓慢,然后在group_id字段上增加索引,则会加快查询

3、当只要一行数据时使用LIMIT 1

当你查询表的有些时候,你已经知道结果只会有一条结果,单因为你可能需要去fetch游标,或是你也许会去检查返回的记录数。

在这种情况下,加上LIMIT 1 可以增加性能。这样一样, MySQL数据库引擎会在找到一条数据后停止搜索,而不是继续往后查找下一条符合记录的数据。

下面的示例,只是为了找一下是否有”中国”的用户,很明显,后面的会比前面的更有效率。(请注意,第一条中是Select *,第二条是Select 1)

  1. // 没有效率的:
  2. $r = mysql_query("SELECT * FROM user WHERE country = 'China'");
  3. if (mysql_num_rows($r) > 0) {
  4. // ...
  5. }
  6. // 有效率的:
  7. $r = mysql_query("SELECT 1 FROM user WHERE country = 'China' LIMIT 1");
  8. if (mysql_num_rows($r) > 0) {
  9. // ...
  10. }

4、为搜索字段建索引
索引并不一定就是给主键或是唯一的字段。如果在你的表中,有某个字段你总要会经常用来做搜索,那么,请为其建立索引吧。

5、在Join表的时候使用相当类型的列,并将其索引
如果你的应用程序有很多JOIN查询,你应该确认两个表中Join的字段是被建过索引的。这样,MySQL内部会启动为你优化Join的SQL语句的机制。

而且,这些被用来Join的字段,应该是相同的类型的。例如:如果你要把DECIMAL字段和一个INT字段JOIN在一起,MYSQL就无法使用他们的索引。对于那些STRING类型,还需要有相同的字符集才行(两个表的字符集有可能不一样)



关注TinyMeng博客,更多精彩分享,敬请期待!
 

站点信息