MySQL:选择数百万行

时间:2014-03-14 17:33:06

标签: mysql sql

我有一个大约3200万行的数据集,我试图导出为分析项目提供一些数据。

由于我的最终数据查询量很大,我尝试限制最初必须使用的行数。我通过在主表(32Million)记录上运行创建表来实现此目的,并在另一个表上创建约5k记录的连接。我在JOIN发生的列上制作了索引,但在条件不同的情况下却没有。此查询现在已运行超过4个小时。

我可以做些什么来加快速度,如果有什么东西,是否值得停止此查询,执行此操作并重新开始?数据集是静态的,我不担心长期保留任何东西或适当的数据库设计。我只需要取出数据并丢弃架构。

查询的简化版本位于

之下
CREATE TABLE RELEVANT_ALERTS
SELECT a.time, s.name,s.class, ...
FROM alerts a, sig s
WHERE a.IP <> 0  
AND a.IP not between x and y
AND s.class in ('c1','c2','c3')

5 个答案:

答案 0 :(得分:2)

尝试解释选择以查看首先发生的事情。您的索引是否已正确设置?

你也没有用主键加入这两个表,是故意的吗?你的主键和外键在哪里?

您还可以向我们提供表格架构吗?

另外,您的硬件可能会出现问题吗? RAM和处理能力有多少?我希望你不是在单核处理器上运行它,因为这需要很长时间

我有一个2,000,000,000(20亿行,219 Gig)的表,使用正确设置索引执行类似查询的时间不会超过0.3秒。这是一个8(2ghz)核心处理器,64GB内存。所以不是数据库大小最强大的设置,但索引保存在内存中,因此查询可以很快。

不应该花那么长时间。你能否确保在a.IP和s.class上有索引。

你也不能把a.IP&lt;&gt; a.IP之后的= 0比较不在x和y之间,所以你已经有一个0比较的过滤集(因为这将比较我相信的每一条记录)

您可以将s.class作为第一个比较移动,具体取决于表必须真正加快比较的行数。

答案 1 :(得分:0)

您的加入似乎是完全交叉加入。无论如何,这将花费很长时间。两个表中都没有共同字段吗?你为什么需要这个加入?如果您确实想要这样做,则应首先创建两个表alertssig的表格,以满足您的WHERE conditions,然后加入生成的表格(如果必须的话)。

答案 2 :(得分:0)

同意Vish。

此外,根据您的查询工作量,如果当前 InnoDB ,您可能会将内部存储引擎更改为 MyISAM ,因为Mysiam更适合于读取只有查询。

ALTER TABLE my_table ENGINE = MyISAM;

此外,您可以更改数据库的isolation level。例如,要将隔离级别设置为read uncommitted:

SET tx_isolation = 'READ-UNCOMMITTED';

答案 3 :(得分:-3)

首先尝试“explain select”以查看什么减慢了它,然后尝试添加一些索引,如果你没有任何

答案 4 :(得分:-4)

相信我,4个小时是非常正常的:因为你有一个3200万行的表,你加入了juste乘以3200万,所以你的查询的复杂度为320000000 * 5000 ...... 为了避免这种情况,我建议你使用ETL WORFLOW ......就像微软SSIS一样...... 使用SSIS,你可以减少很多查询的时间......