我遇到了一些在非常基本的查询上查询时间很长的问题。这是我第一次使用更大的桌子(12.5密耳行),我只是想弄清楚可能是什么瓶颈或我可以做些什么来提高性能。所有数据都在1表中。
服务器规格:
Windows Server 2008 R2 Standard 英特尔至强X3430 @ 2.40GHz 4GB RAM 1TB 7200RPM硬盘
表格信息
ID int(10)UN PK AI
商店 int(2)UN
日期日期时间
注册 int(2)UN
收银员 int(3)联合国
部门 int(4)联合国
总计小数(7,2)
客户 int(5)联合国
项目 int(5)联合国
时间 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
我当然可以提供更多信息,但是有什么明显的说明为什么这些运行速度如此之慢?
答案 0 :(得分: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 ;
答案 1 :(得分:0)
是的,有2个明显的问题。在第一个查询中,您没有标准 - 因此您要求读取,分组和汇总整个销售表。分组也将创建一个临时表。因此,您将进行表扫描,并且仅限于硬件可以提供的io性能,这可能是您的瓶颈。
在第二个查询中,您正在日期列日期(日期)上执行一个函数,这意味着即使您有一个日期索引,它也无法使用该索引,所以再一次你要去表扫描桌子。
话虽如此,你应该对每个查询运行explain extended SELECT ....以获得对此评估的信心。
答案 2 :(得分:-1)
您可以尝试进行第二次查询的两件事: (1)为datetime列创建索引。 (2)使用整数代替日期时间,2013-10-22 =&gt; 20131022