2013-10-24 200 views
0

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

服务器规格:

的Windows Server 2008 R2标准 英特尔至强X3430 @ 2.40GHz的 4GB内存1TB 7200RPM硬盘

表信息

ID INT(10 )联合国PK AI
商店 INT(2)联合国
日期日期时间
注册 INT(2)联合国
出纳 INT(3)联合国
INT(4)联合国
十进制(7 ,2)
客户 int(5)UN
项目 INT(5)UN
时间 INT(5)UN

例查询和时报

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

19.56sec

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

9.59sec

我当然可以提供更多的信息,但有什么明显的迹象显示为什么这些运行速度如此之慢?

+2

你有什么指标?使用'explain'并告诉我们你选择的语句的结果。 – kmas

+0

它可能会慢,因为索引,那么my.ini配置文件也可能是问题。 – kmas

+0

而不是你有的表信息,添加'SHOW CREATE TABLE sales;'输出。对于其他人来说,了解表结构和索引的详细信息会更有帮助。 –

回答

0

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

在第二个查询中,您正在日期列Date(Date)上执行一个函数,这意味着即使您在Date上有一个索引,也不能使用该索引,因此再一次您将要表扫描表。这样说的话,你应该在每个查询上运行explain扩展的SELECT ....来获得这个评估的信心。

+0

感谢您的建议!我将不得不考虑是否有替代日期(日期),我肯定会检查解释扩展。 –

+0

将解释的结果粘贴到您的问题中:这将有助于@ypercube和我自己更好地理解您的问题。你也可以调整你的mysql实例的参数,所以这些可能会有所帮助。你的表是innodb引擎吗?我强烈建议。 – gview

-1

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

1

查询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 ; 
+0

感谢您的回应!将索引添加到第一个查询后,时间减少到约9秒。在第二个查询中删除Date(Date)并将其替换为您的建议将查询截断为1.6秒。 –

+0

这听起来仍然非常低效。我建议你检查你的mysql配置。设置。 –