SQL - 减少时间请求

时间:2013-04-16 08:26:34

标签: mysql sql

我有这张桌子(eod):

| eod_id | company_symbol |    date    | open  | close | high  |  low  | 
|      1 |            AAA | 01-01-2000 | 40.00 | 42.00 | 43.00 | 39.00 |

我使用这3个请求:

1. SELECT COUNT(*) FROM eod WHERE company_symbol="AAA" AND CLOSE>OPEN 
AND DATE BETWEEN "0000-00-00" AND "0000-00-00";
2. SELECT COUNT(*) FROM eod WHERE company_symbol="AAA" AND CLOSE<OPEN 
AND DATE BETWEEN "0000-00-00" AND "0000-00-00";
3. SELECT min(date), max(date) FROM eod WHERE company_symbol="AAA"

每个请求大约需要执行0,7秒,因此我希望减少每个请求的时间。我怎么处理?是否可以只在一个中执行两个第一个请求?

先谢谢你的帮助,

史蒂夫

3 个答案:

答案 0 :(得分:1)

结合前两个:

SELECT
    SUM(CASE WHEN CLOSE>OPEN THEN 1 ELSE 0 END) as Higher,
    SUM(CASE WHEN CLOSE<OPEN THEN 1 ELSE 0 END) as Lower
FROM eod WHERE company_symbol="AAA"
AND DATE BETWEEN "0000-00-00" AND "0000-00-00";

答案 1 :(得分:0)

您怀疑可以合并前两个查询:

SELECT  COUNT(CASE WHEN CLOSE < OPEN THEN 1 END),
        COUNT(CASE WHEN CLOSE > OPEN THEN 1 END) 
FROM    eod
WHERE   company_symbol="AAA" 
AND     DATE BETWEEN "0000-00-00" AND "0000-00-00";

(我假设您DATE BETWEEN子句只是一个示例,但如果不是,则可以更改为DATE = "0000-00-00"

我要说如果你的dbms支持非关键列,那么在company_symbol上有一个非聚簇索引,那么在这个索引中包含OPENCLOSEDATE,那么取决于如何经常你插入/更新数据也可能值得在你的日期列上有索引。

与往常基于性能的问题一样,您可以更好地帮助自己,而不是帮助您,您可以查看执行计划,IO统计信息以及运行各种测试等,以确定减慢查询的速度,一次您已经更具体地确定了问题,然后可以查看添加特定索引来解决问题。

答案 2 :(得分:-1)

我提高性能的第一个建议是永远不会使用 count(*),而是在您的情况下使用 count(eod_id)这样的单个列。