【发布时间】:2011-05-06 22:57:50
【问题描述】:
我是一名科学家,我使用 MySQL 作为数值模拟结果的存储设备。通常我有一组通过我的实验获得的数据和一个控制组。这两个数据集存储在一个表中。一个指标字段告诉我记录是来自实验还是来自控制集。该表通常有约 1 亿条记录。 5000 万个实验和 5000 万个对照。
当我对数据进行后处理时,我的典型任务包括首先发出以下两个查询:
select b0,t0 from results_1mregr_c_ew_f where RC='E' and df>60 /// getting experiments data
和
select b0,t0 from results_1mregr_c_ew_f where RC='C' and df>60 /// getting controls data
我在 RC,df 上有一个多列索引。 这些查询花费大量时间,并且查询花费大部分时间“发送数据”
我在配备 12GB RAM 的 8core MacPro 上运行它。 我是这台机器的单个用户,这个任务是主要任务,因此我可以将所有 RAM 专用于 MySQL。所有表都是 MyISAM(如果这样可以提高查询速度,我可以转换它们)。
如果有任何关于如何加快这些查询速度的建议,我将不胜感激。 我是否应该更改一些设置、索引、查询......
在每个查询中,我预计会返回大约 5000 万条记录。 请注意,由于管理原因,不能将表拆分为两个表,一个包含实验,另一个包含对照观察。
这是输出:
explain select b0, t0 from results_1mregr_c_ew_f where RC="C" and df>60
+----+-----------+---------------------+-----+-------------+---+-------+----+-------+-----------+
| id |select_type|table |type |possible_keys|key|key_len|ref |rows |Extra |
+----+-----------+---------------------+-----+-------------+---+-------+----+-------+-----------+
| 1 |SIMPLE |results_1mregr_c_ew_f|range|ff |ff |11 |NULL|6251121|Using where|
+----+-----------+---------------------+-----+-------------+---+-------+----+-------+-----------+
下面是输出:
show indexes from results_1mregr_c_ew_f;
+-----------------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-----------------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| results_1mregr_c_ew_f | 0 | PRIMARY | 1 | id | A | 50793996 | NULL | NULL | | BTREE | |
| results_1mregr_c_ew_f | 1 | ff | 1 | RC | A | 3 | NULL | NULL | | BTREE | |
| results_1mregr_c_ew_f | 1 | ff | 2 | df | A | 120 | NULL | NULL | | BTREE | |
+-----------------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
下面是输出:
CREATE TABLE `results_1mregr_c_ew_f` (
`b0` double NOT NULL COMMENT ' ',
`s0` double NOT NULL,
`t0` double NOT NULL,
`b1` double NOT NULL,
`s1` double NOT NULL,
`t1` double NOT NULL,
`b2` double NOT NULL,
`s2` double NOT NULL,
`t2` double NOT NULL,
`b3` double NOT NULL,
`s3` double NOT NULL,
`t3` double NOT NULL,
`b4` double NOT NULL,
`s4` double NOT NULL,
`t4` double NOT NULL,
`AD` char(4) NOT NULL,
`chisq` double NOT NULL,
`RC` char(7) NOT NULL,
`colq` varchar(255) NOT NULL,
`df` int(11) NOT NULL,
`ncol` int(11) NOT NULL,
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`p1` float NOT NULL,
`p2` float NOT NULL,
`p3` float NOT NULL,
`p4` float NOT NULL,
PRIMARY KEY (`id`),
KEY `ff` (`RC`,`df`)
) ENGINE=MyISAM AUTO_INCREMENT=50793997 DEFAULT CHARSET=ascii |
【问题讨论】:
-
您应该发布
SHOW CREATE TABLE results和EXPLAIN SELECT ...的输出,以便我们更好地了解发生了什么。 MySQL 可能没有使用您的索引,因为它认为表扫描会更快。你要返回多少行? -
添加到上面...显示结果中的索引;谢谢
-
您能在此处发布您的表架构吗?
-
完成,很抱歉没有在我的第一篇文章中发布此信息。
-
目前处理 1 批 5000 万行需要多长时间?
标签: mysql performance