Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.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查询性能帮助_Mysql_Performance_Group By_Bigtable - Fatal编程技术网

mysql查询性能帮助

mysql查询性能帮助,mysql,performance,group-by,bigtable,Mysql,Performance,Group By,Bigtable,我有一个很大的表格,用来存储电子邮件中的单词 mysql> explain t_message_words; +----------------+---------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------------+---------+------+-----+---------+---

我有一个很大的表格,用来存储电子邮件中的单词

mysql> explain t_message_words;
+----------------+---------+------+-----+---------+----------------+
| Field          | Type    | Null | Key | Default | Extra          |
+----------------+---------+------+-----+---------+----------------+
| mwr_key        | int(11) | NO   | PRI | NULL    | auto_increment |
| mwr_message_id | int(11) | NO   | MUL | NULL    |                |
| mwr_word_id    | int(11) | NO   | MUL | NULL    |                |
| mwr_count      | int(11) | NO   |     | 0       |                |
+----------------+---------+------+-----+---------+----------------+
表中包含大约100万行
mwr_message_id是一个FK to messages表
mwr_word_id是一个FK到word表
mwr_count是消息mwr_message_id中单词mwr_word_id的出现次数

为了计算最常用的单词,我使用以下查询

SELECT SUM(mwr_count) AS word_count, mwr_word_id
FROM t_message_words
GROUP BY mwr_word_id
ORDER BY word_count DESC
LIMIT 100;
几乎永远运行(在测试服务器上超过半小时)

我能做些什么来“加速”查询(除了添加更多的ram、更多的cpu和更快的磁盘)

提前谢谢你
斯特凡诺

附言:解释结果:

mysql> EXPLAIN SELECT SUM(mwr_count) AS word_count, mwr_word_id
    -> FROM t_message_words
    -> GROUP BY mwr_word_id
    -> ORDER BY word_count DESC
    -> LIMIT 100;
+----+-------------+-----------------+-------+---------------+----------------------+---------+------+----------+---------------------------------+
| id | select_type | table           | type  | possible_keys | key                  | key_len | ref  | rows     | Extra                           |
+----+-------------+-----------------+-------+---------------+----------------------+---------+------+----------+---------------------------------+
|  1 | SIMPLE      | t_message_words | index | NULL          | IDX_t_message_words2 | 4       | NULL | 94823285 | Using temporary; Using filesort |
+----+-------------+-----------------+-------+---------------+----------------------+---------+------+----------+---------------------------------+
1 row in set (0.01 sec)

也许在
mwr\u word\u id
上建立索引会有所帮助。它现在是一个键的一部分,但您可以添加一个键纯粹为了这个


您还可以在配置文件中增加mysql的缓存。

也许在
mwr\u word\u id
上的索引会有所帮助。它现在是一个键的一部分,但您可以添加一个键纯粹为了这个


您还可以在配置文件中增加mysql的缓存。

我不知道您是否有一个按mwr\u message\u id和mwr\u word\u id的索引,或者仅按mwr\u word\u id的索引,或者除主键之外的任何其他索引。如果您没有mwr_word_id索引(或将mwr_word_id作为第一个字段),我建议您添加一个索引

如果您已经有了这样一个索引,而这对于一个非常常见的场景来说确实是一件痛苦的事情,那么我建议您在words表中添加一些冗余,以汇总所有mwr_message_id中mwr_word_id的总出现次数


您还可以向t_message_words添加一些触发器来处理这种冗余的更新。

我不知道您是否有一个按mwr_message_id和mwr_word_id的索引,或者仅按mwr_word_id的索引,或者除主键索引之外的任何其他索引。如果您没有mwr_word_id索引(或将mwr_word_id作为第一个字段),我建议您添加一个索引

如果您已经有了这样一个索引,而这对于一个非常常见的场景来说确实是一件痛苦的事情,那么我建议您在words表中添加一些冗余,以汇总所有mwr_message_id中mwr_word_id的总出现次数



您还可以向t_message_words添加一些触发器来处理此冗余的更新。

UPD:如果您需要运行此查询一次,请等待它完成。如果您需要多次运行此查询-通过触发器每次插入/更新/删除创建具有唯一单词的表并更新此表中的计数-UPD:如果您需要运行此查询一次-请等待它完成。如果您需要多次运行此查询,请通过触发器在该表中创建具有唯一单词和更新计数的表每次插入/更新/删除

谢谢,不幸的是,mwr_word_id已被索引:(关于缓存,请告诉我我应该尝试更改my.ini中的哪些参数?我已经修改了innodb_buffer_pool_大小(从77MB到512MB)执行时间没有任何显著变化。@Stefano:“内存中临时表的最大大小是tmp_table_size和max_heap_table_size中的最小值”,请参阅。我认为您增加了错误的设置:)@Stefano使用EXPLAIN查询查看它的功能也没有什么坏处。@extraneon:感谢您指出mysql文档中的页面。我试图增加tmp_table_size和max_heap_table_size,但没有办法:(我用解释结果更新了问题too@Stefano如果不使用order_by将查询拆分到内存中明确定义的临时表中,而不是从该表中进行有序选择,是否可以接受?优点?手工制作的临时表的规则不同,可能比自动临时表大。另外,您还可以可能在临时表上使用MyISAM,这对于group_by应该会快一点。不幸的是,mwr_word_id已经被索引:(关于缓存,请告诉我我应该尝试更改my.ini中的哪个参数?我已经修改了innodb_buffer_pool_大小(从77MB到512MB)执行时间没有任何重大变化。@Stefano:“内存中临时表的最大大小是tmp_table_size和max_heap_table_size的最小值”,请参阅。我认为您增加了错误的设置:)@Stefano使用EXPLAIN查询查看它的功能也没有什么坏处。@extraneon:感谢您指出mysql文档中的页面。我试图增加tmp_table_size和max_heap_table_size,但没有办法:(我用解释结果更新了问题too@Stefano如果不使用order_by将查询拆分到内存中明确定义的临时表中,而不是从该表中进行有序选择,是否可以接受?优点?手工制作的临时表的规则不同,可能比自动临时表大。另外,您还可以a可能在临时表上使用MyISAM,这对于group_by来说应该快一点。是的,我已经为这两个表编制了索引。事实上,我无法通过在Word表中添加冗余来解决此问题,因为“真实”查询(此处未显示semplicity)也包含mwr_message_id字段。那么,您应该向我们显示真实的查询,以便我们可以建议更准确的答案:)答案似乎是我发布的查询无法加速:(我本可以发布我面临的真实查询,但很难找到答案。谢谢你的建议,我正在做一些“类似”的事情来解决这个问题。是的,我已经将这两个问题都编入了索引。事实上,我无法在单词表中添加冗余来解决这个问题,因为“真实”查询(此处未显示semplicity)也包含mwr_message_id字段。那么,您应该向我们显示真实的查询,以便我们可以建议更准确的答案:)答案似乎是我发布的查询无法加速:(我本可以发布我面临的真实问题,但很难找到答案。谢谢你的建议,我正在做一些“类似”的事情来解决这个问题。对不起,安德烈,但我看不出这样一个索引的原因。mwr
mysql> EXPLAIN SELECT SUM(mwr_count) AS word_count, mwr_word_id
    -> FROM t_message_words
    -> GROUP BY mwr_word_id
    -> ORDER BY word_count DESC
    -> LIMIT 100;
+----+-------------+-----------------+-------+---------------+----------------------+---------+------+----------+---------------------------------+
| id | select_type | table           | type  | possible_keys | key                  | key_len | ref  | rows     | Extra                           |
+----+-------------+-----------------+-------+---------------+----------------------+---------+------+----------+---------------------------------+
|  1 | SIMPLE      | t_message_words | index | NULL          | IDX_t_message_words2 | 4       | NULL | 94823285 | Using temporary; Using filesort |
+----+-------------+-----------------+-------+---------------+----------------------+---------+------+----------+---------------------------------+
1 row in set (0.01 sec)