3

我有以下 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 万条数据,有没有更好的方法来编写这个查询?
4

5 回答 5

1
  1. 就像艾伦说的

  2. 尝试 count(id) 应该更快。它取决于数据库引擎,但根据我的经验,不使用 * 总是更快。

于 2010-11-09T04:43:40.020 回答
1
  1. 查询的执行时间取决于太多问题,无法确定需要多长时间。服务器上的负载、行数等。你能做的最好的就是在典型负载下运行它,看看它需要多长时间。

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

于 2010-11-08T23:17:06.307 回答
1

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

wrt 提高特定查询的性能,一个复合索引

... KEY itemType_sysCreationDate (itemType, sysCreationDate) ...

on table 将允许使用索引执行该查询。没有比这更好的了。请注意,顺序重要。

此外,用应用层中生成的显式日期字符串替换“now()”将允许 mysql 使用它的查询缓存,如果它之前看到过查询,并且表自上次执行以来没有更新,并且查询仍然在它的缓存中。并不是说我提倡 MySQL 的查询缓存。;)

于 2010-11-09T23:02:47.227 回答
0

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

如果你不能真正改进查询,也许你需要一个稍微不同的解决方案 -

  1. 在问题上投入更多硬件 - 查看瓶颈在哪里并尝试升级硬件的那部分

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

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

于 2010-12-22T04:17:36.093 回答
0

您一定在考虑 MS-SQL 服务器中的查询计划,如果没记错的话,它会提到一些关于时间的内容。事实是,无论如何,这是一个废话。要确定查询是否会尽可能快地执行,您需要show index from <table>和的组合explain ...

itemType使用and的索引,您的查询将是最快的sysCreationDate。这将允许计算一系列连续的索引条目。

于 2010-12-22T04:29:37.560 回答