2010-11-08 94 views
3

我有以下MySQL查询MySQL查询性能 -

explain SELECT count(*) as assetCount 
      FROM MdhRawAsset m 
     where sysCreationDate > date_add(now(), INTERVAL -1 DAY) 
      AND sysCreationDate <= now() 
      AND itemType = 'TS'; 

结果:

| id | select_type | table | type |possible_keys              
| 1 | SIMPLE  | m  | range | MdhRawAsset_on_sysCreationDate, MdhRawAsset_itemType    
--------------------------------------------------------------------- 
|Key       |Key_len | ref | rows | Extra  | 
MdhRawAsset_on_sysCreationDate| 8  | NULL | 53269 | Using where | 

问题:

  1. 我怎么会知道这个查询的执行时间?
  2. MdhRawAsset包含3750万数据,有没有更好的方式来写这个查询?
+0

你正在使用哪个版本的mysql?确实是 – 2010-11-09 08:44:50

回答

1
  1. 查询的执行时间取决于太多的问题,以确定它需要多长时间。服务器上的负载,行数等等。您可以做的最好的方法是在典型负载中运行它,并查看需要多长时间。

  2. 您似乎已经设置了正确的索引,所以我没有看到更好的优化方法,但其他人可能比我更了解。

+0

。 '使用where'告诉我们这是非常好的执行计划,这样的查询将在一瞬间执行。 – zerkms 2010-11-08 23:46:24

1
  1. 像艾伦说

  2. 尝试计数(ID),反而是应该会更快。它依赖于数据库引擎,但根据我的经验,不使用*总是更快。

+0

与COUNT(*)与COUNT(id)的细微差别:count(*)将包含NULL,而count(id)将排除它们。 – beach 2010-11-09 05:15:45

+0

COUNT(*)不**表示必须读取表中的所有列。它仅仅意味着在不查看值的情况下对每行进行计数。 – 2010-12-22 05:35:33

1

首先,执行时间取决于表,服务器,负载以及不同级别的缓存被预热。

w.r.t.提高该特定查询将复合指数的上

性能

... KEY itemType_sysCreationDate(ITEMTYPE,sysCreationDate) ...

在表将允许使用仅索引来执行该查询。不能比这更好。注意订单重要。

此外,用应用程序层中生成的显式日期字符串替换'now()'将允许mysql在查询之前使用它的查询缓存,并且该表自上次执行后未更新,并且查询仍在缓存中。不是我主张MySQL的查询缓存。 ;)

0

目前执行此查询需要多长时间?你确实有很多数据。

如果你不能真正提高查询,也许你需要一个稍微不同的解决方案 - 在这个问题

  1. 投入更多的硬件 - 看到的瓶颈,并尝试升级硬件的一部分

  2. 使用汇总表 - 如果这是一个经常绘制的报表,则可能有助于使用数据仓库技术来维护汇总表。您可以随时更新汇总表(当交易正在进行时)或定期(如果不需要最新信息)更新汇总表。

请注意,当您将数据放入汇总表时,不需要进行全部计数 - 例如,您在事务表中添加的每条新记录都只需执行existing_summary_count = existing_summary_count + 1,即可获得增加的汇总值,而无需执行昂贵的查询。

0

您必须考虑从MS-SQL服务器查询计划的事情,如果内存服务,提及一些关于时间的东西。事实是,无论如何,这是一个废话。要确定查询是否将尽可能合理地执行,您需要组合show index from <table>explain ...

您的查询将是最快的,索引为itemTypesysCreationDate。这将允许计数顺序的一系列索引条目。