MySQL查询需要很长时间

时间:2013-05-10 15:35:01

标签: mysql sql performance

我对一个包含大约1400万条记录的表进行了非常简单的查询,大约需要30分钟才能完成。这是查询:

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进行过滤似乎是罪魁祸首,并且列确实有索引。我不知道还有什么可以尝试的。

6 个答案:

答案 0 :(得分:1)

您可以从在client_number上创建INDEX开始,看看它有何帮助,但是使用EXPLAIN命令分析问题时可以获得最佳效果。

http://dev.mysql.com/doc/refman/5.5/en/execution-plan-information.html

答案 1 :(得分:1)

桌子是myisam还是innodb?如果innodb将innodb缓冲区增加到很大量,那么整个表可以适应内存。如果myisam好,它应该通过OS缓存缓冲区自动加载到内存中。安装更多内存。安装更快的磁盘驱动器考虑到您正在进行整个表格扫描(减去看起来像您的测试客户端ID的客户端号码,这些似乎是您唯一的解决方案吗?)

将表加载到RAM中需要一段时间,因此一旦db启动就不要指望它。

答案 2 :(得分:1)

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

没有必要查看解释。索引不太可能有用,除非99%左右的记录的client_number为1234567.索引可能会使事情起作用,因为这种现象称为颠簸。

您的问题是MySQL查询引擎的硬件不足或资源不足。我首先看看引擎的缓冲,然后是处理器的磁盘硬件和带宽。

答案 3 :(得分:0)

也许......

where client_number = '1234567'

......会快一点。

答案 4 :(得分:0)

如果Client_Number存储为数字字段,则

where client_number = 1234567

如果字符串比较导致它进行转换并且可能阻止使用索引,则可能会更快。

答案 5 :(得分:0)

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

示例:

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