2013-05-10 249 views
0

我对包含大约14百万条记录的表进行了非常简单的查询,这些记录大约需要30分钟才能完成。以下是查询:MySQL查询花费很长时间

select a.switch_name, a.recording_id, a.recording_date, a.start_time, 
     a.recording_id, a.duration, a.ani, a.dnis, a.agent_id, a.campaign, 
     a.call_type, a.agent_call_result, a.queue_name, a.rec_stopped, 
     a.balance, a.client_number, a.case_number, a.team_code 
from recording_tbl as a 
where client_number <> '1234567' 

过滤client_number似乎是罪魁祸首,并且列确实有索引。我不知道还有什么可以尝试的。

+1

什么'EXPLAIN'说明了什么? – 2013-05-10 15:35:21

+4

您正在从一张表中检索一千四百万减1条记录中的所有数据,并且您想知道为什么它很慢? – 2013-05-10 15:37:00

+0

@Niels好吧,不一定减1记录,因为客户端号码可能在任何数量的录音中,但无论如何都是好的。 – 2013-05-10 15:40:50

回答

0

也许......

where client_number = '1234567' 

...会快一点。

+0

它**可能**只是1399.9万行被分配给这个客户,你不知道.... – 2013-05-10 15:46:54

0

如果客户编号存储为数字字段,然后

where client_number = 1234567 

可能更快,如果字符串比较是导致它做一个演员和可能防止正在使用的索引。

1

表是myisam还是innodb?如果innodb大量增加innodb缓冲区,那么整个表都可以放入内存。如果myisam好,它应该通过操作系统缓存缓冲区自动加载到内存中。安装更多的RAM。安装更快的磁盘驱动器这些似乎是你唯一的解决方案,考虑到你正在做整个表扫描(减去任何客户端号码似乎是你的测试客户端ID?)

它需要一段时间加载到RAM以及所以不要期望它作为db启动之后。

1

您的查询是在查询中的一个表上执行全表扫描,recording_tbl。我是,假设这是一张表,而不是一个视图,因为“tbl”前缀。如果这是一个视图,那么你需要优化视图。

有没有必要看看解释。索引不太可能有用,除非99%左右的记录具有1234567的client_number。由于称为抖动的现象,索引可能使事情发挥作用。

您的问题是小型硬件或MySQL查询引擎的underellocated资源。我首先会看看引擎的缓冲区,然后是处理器的硬件和带宽。

0

为什么你需要返回14m行? (我假设大多数记录没有你正在搜索的ID)。 如果您不需要需要所有14m行,请将LIMIT添加到查询的末尾。更少的行 - >更少的内存 - >更快的查询。

实施例:

select a.switch_name, a.recording_id, a.recording_date, a.start_time, 
    a.recording_id, a.duration, a.ani, a.dnis, a.agent_id, a.campaign, 
    a.call_type, a.agent_call_result, a.queue_name, a.rec_stopped, 
    a.balance, a.client_number, a.case_number, a.team_code 
from recording_tbl as a 
where client_number <> '1234567' 
LIMIT 1000 

将返回第一1000行。

这里有一个如何在不同的SQL RDBMS返回前N行的比较: http://www.petefreitag.com/item/59.cfm