mysql 查询速度优化

来源:互联网 发布:淘宝老顾客回购权重 编辑:程序博客网 时间:2024/05/21 14:01

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

      当你查询表的有些时候,你已经知道结果只会有一条结果,但因为你可能需要去fetch游标,或是你也许会去检查返回的记录数。在这种情况下,加上 LIMIT 1 可以增加性能。这样一样,MySQL数据库引擎会在找到一条数据后停止搜索,而不是继续往后查少下一条符合记录的数据。  

 

2, EXPLAIN   SELECT 查询用来跟踪查看效果

 

   使用 EXPLAIN 关键字可以让你知道MySQL是如何处理你的SQL语句的。这可以帮你分析你的查询语句或是表结构的性能瓶颈。EXPLAIN 的查询结果还会告诉你你的索引主键被如何利用的,你的数据表是如何被搜索和排序的……等等,等等。 

 

3. 避免 SELECT *

    从数据库里读出越多的数据,那么查询就会变得越慢。并且,如果你的数据库服务器和WEB服务器是两台独立的服务器的话,这还会增加网络传输的负载。

 

 

4. 拆分大的 DELETE 或 INSERT 语句

    如果你需要在一个在线的网站上去执行一个大的 DELETE 或 INSERT 查询,你需要非常小心,要避免你的操作让你的整个网站停止相应。因为这两个操作是会锁表的,表一锁住了,别的操作都进不来了。Apache 会有很多的子进程或线程。所以,其工作起来相当有效率,而我们的服务器也不希望有太多的子进程,线程和数据库链接,这是极大的占服务器资源的事情,尤其是内存。 

如果你把你的表锁上一段时间,比如30秒钟,那么对于一个有很高访问量的站点来说,这30秒所积累的访问进程/线程,数据库链接,打开的文件数,可能不仅仅会让你泊WEB服务Crash,还可能会让你的整台服务器马上掛了。所以,如果你有一个大的处理,你定你一定把其拆分,使用 LIMIT 条件是一个好的方法。下面是一个示例:

18,

 

01 while (1) { 

 

02     //每次只做1000条 

 

03     mysql_query("DELETE FROM logs WHERE log_date <= '2009-11-01' LIMIT 1000"); 

 

04     if (mysql_affected_rows() == 0) { 

 

05         // 没得可删了,退出! 

 

06         break; 

 

07     } 

 

08     // 每次都要休息一会儿 

 

09     usleep(50000); 

 

10 }

 

4,MySQL查询可以启用高速查询缓存。这是提高数据库性能的有效Mysql优化方法之一。当同一个查询被执行多次时,从缓存中提取数据和直接从数据库中返回数据快很多,

 

5,使用连接(join)来代替子查询
     SELECT * FROM customerinfo
     WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo )
     用下面来替换:
     SELECT * FROM customerinfo 
     LEFT JOIN salesinfo ON customerinfo.CustomerID=salesinfo.CustomerID 
     WHERE salesinfo.CustomerID IS NULL 

原创粉丝点击