Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:411M行的慢速平均查询_Mysql_Sql_Average_Database Performance - Fatal编程技术网

MySQL:411M行的慢速平均查询

MySQL:411M行的慢速平均查询,mysql,sql,average,database-performance,Mysql,Sql,Average,Database Performance,我有一个简单的表(由django创建)-引擎InnoDB: +-------------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------+------------------+------+-----+---------+-------------

我有一个简单的表(由django创建)-引擎InnoDB:

+-------------+------------------+------+-----+---------+----------------+
| 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