0

我在非常基本的查询上遇到了一些查询时间长的问题。这是我第一次使用更大的表(1250 万行),我只是想弄清楚什么可能是瓶颈,或者我可以做些什么来提高性能。所有数据都在一张表中。

服务器规格:

Windows Server 2008 R2 标准 Intel Xeon X3430 @ 2.40GHz 4GB RAM 1TB 7200RPM HDD

表信息

ID int(10) UN PK AI
Store int(2) UN
Date datetime
Register int(2) UN
Cashier int(3) UN
Department int(4) UN
Total decimal(7,2)
Customers int(5) UN
Items int( 5) 联合国
时间int(5) 联合国

示例查询和时间

SELECT Store, sum(Total)   
FROM sales   
GROUP BY Store

19.56 秒

SELECT Date, Register, Customers, Items, Total   
FROM sales  
WHERE Date(Date) = Date('2013-10-22')   
AND Store = 1

9.59 秒

我当然可以提供更多信息,但是有什么明显的原因可以解释为什么这些运行如此缓慢?

4

3 回答 3

1

查询一:

SELECT Store, sum(Total)
FROM sales
GROUP BY Store ;

在 上添加索引(Store, Total)

ALTER TABLE sales
  ADD INDEX store_total_IX             -- pick a name for the index
    (store, total) ;

查询 2:

SELECT Date, Register, Customers, Items, Total
FROM sales
WHERE Date(Date) = Date('2013-10-22')
AND Store = 1 ;

在 上添加索引(Store, Date)

ALTER TABLE sales
  ADD INDEX store_date_IX             -- pick a name for the index
    (store, date) ;

并重写查询 - 以便可以使用索引 - 作为:

SELECT Date, Register, Customers, Items, Total
FROM sales
WHERE Date >= '2013-10-22'
  AND Date < '2013-10-22' + INTERVAL 1 DAY
  AND Store = 1 ;
于 2013-10-24T20:54:08.233 回答
0

是的,有两个明显的问题。在第一个查询中,您没有条件——因此您要求读取、分组和汇总整个销售表。分组也将创建一个临时表。因此,您将进行表扫描,这将仅限于硬件可以提供的 io 性能,这可能是您的瓶颈。

在第二个查询中,您正在对 Date 列 Date(Date) 执行一个函数,这意味着即使您在 Date 上有一个索引,它也无法利用该索引,因此您将再次对表进行表扫描.

话虽如此,您应该在每个查询上运行 explain extended SELECT.... 以获得对该评估的信心。

于 2013-10-24T20:51:35.400 回答
-1

您可以为第二个查询尝试两件事:(1)为日期时间列创建索引。(2)使用整数代替日期时间,2013-10-22 => 20131022

于 2013-10-24T20:53:46.357 回答