MySQL:411M行的慢速平均查询
我有一个简单的表(由django创建)-引擎InnoDB:MySQL:411M行的慢速平均查询,mysql,sql,average,database-performance,Mysql,Sql,Average,Database Performance,我有一个简单的表(由django创建)-引擎InnoDB: +-------------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------+------------------+------+-----+---------+-------------
+-------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+------------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| correlation | double | NO | | NULL | |
| gene1_id | int(10) unsigned | NO | MUL | NULL | |
| gene2_id | int(10) unsigned | NO | MUL | NULL | |
+-------------+------------------+------+-----+---------+----------------+
该表的行数超过4.11亿行。
(目标表将有大约461M行,21471*21470行)
我的主要查询是这样的,最多可能指定10个基因
SELECT gene1_id, AVG(correlation) AS avg FROM genescorrelation
WHERE gene2_id IN (176829, 176519, 176230)
GROUP BY gene1_id ORDER BY NULL
此查询速度非常慢,运行大约需要2分钟:
21471 rows in set (1 min 11.03 sec)
索引(基数看起来很奇怪-太小?):
我刚刚在该表上运行了select count(*),花了22分钟:
select count(*) from predictions_genescorrelation;
+-----------+
| count(*) |
+-----------+
| 411512002 |
+-----------+
1 row in set (22 min 45.05 sec)
有什么不对劲吗?
我怀疑mysql配置设置不正确
在导入数据的过程中,我遇到了空间问题,因此这可能也会影响数据库,尽管我稍后运行了检查表
——这花了2个小时,并声明OK
此外,索引的基数看起来很奇怪。我已经在本地设置了较小的数据库,但它们的值完全不同(254945589528,17)
我应该重做索引吗?
我应该检查MySQL的哪些参数?
我的表设置为InnoDB,MyISAM会有什么不同吗
谢谢,
马塔利
selectcount(*)
如果没有WHERE
子句或没有selectcount(id)
,查询速度非常慢<代码>使用索引(主)
要加快这一进程:
SELECT gene1_id, AVG(correlation) AS avg FROM genescorrelation
WHERE gene2_id IN (176829, 176519, 176230)
GROUP BY gene1_id ORDER BY NULL
您应该按该顺序打开复合键(gene2_id、gene1_id、correlation)。试一试
关于索引基数:Innodb表的统计数据是近似的,不准确(有时是疯狂的)。甚至有一个bug报告
尝试分析表并再次观察基数我认为这个问题更适合于,因为它涉及更多的配置而不是查询性能。对于这样的查询,我将创建一个索引
(gene2\u id,gene1\u id,correlation)
。另外,id
序列号可能完全没有用处,您是否在何处使用过它?您的逻辑主键是什么,(gene2\u id,gene1\u id)
?您需要id
?似乎主键(gene2\u id,gene1\u id)
是唯一的,而且速度更快。此外,gene_id可以是SMALLINT UNSIGNED
的2个字节,而不是当前的2个字节。请继续使用InnoDB。但是检查innodb缓冲池大小;它应该是RAM的70%左右。如果它比桌子大就更好了。搁置这个的逻辑是假的。这是一个优化问题,有很多答案,其中大部分是正交的和加法的。谢谢!基数更改为41151219495522。现在正在处理索引。处理索引不会很快。试试gene2_id,gene1_id。而不是3个零件。如果没有帮助,那么gene2_id、gene1_id、correlation在创建我遇到的索引时:错误1034(HY000):表'predictions_genescorrelation'的键文件不正确;试着修理它。
SELECT gene1_id, AVG(correlation) AS avg FROM genescorrelation
WHERE gene2_id IN (176829, 176519, 176230)
GROUP BY gene1_id ORDER BY NULL