0

我对一个包含大约 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 似乎是罪魁祸首,并且列确实有索引。我不确定还能尝试什么。

4

6 回答 6

1

表是 myisam 还是 innodb?如果 innodb 将 innodb 缓冲区增加到大量,则整个表可以放入内存中。如果 myisam 运行良好,它应该通过 OS 缓存缓冲区自动加载到内存中。安装更多内存。安装更快的磁盘驱动器。考虑到您正在执行整个表扫描,这些似乎是您唯一的解决方案(减去似乎是您的测试客户端 ID 的任何客户端编号?)

将表加载到 RAM 也需要一段时间,所以不要指望数据库一启动就可以。

于 2013-05-10T16:17:13.550 回答
1

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

没必要看解释。索引不太可能有帮助,除非 99% 左右的记录的 client_number 为 1234567。索引可能会使事情正常进行,因为一种称为抖动的现象。

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

于 2013-05-10T16:18:20.383 回答
1

您可以从在 client_number 上创建 INDEX 开始,看看它有什么帮助,但是当您使用 EXPLAIN 命令分析问题时,您会得到最好的结果。

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

于 2013-05-10T15:38:21.307 回答
0

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

where client_number = 1234567

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

于 2013-05-10T16:05:17.113 回答
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

于 2013-05-11T04:26:28.733 回答
0

也许...

where client_number = '1234567'

……会快一点。

于 2013-05-10T15:40:53.600 回答