2010-11-20 59 views
0

我有一个大的MySQL表(约5M行),我经常插入数据。Mysql并发选择并插入数据库缓慢

这张表是一样的,我必须从中读取数据,有时整个数据库由于选择数据而缓慢,而有很多未决的插入。

我在WHERE语句中使用的每个字段都放了索引,所以我真的不知道select为什么会这么慢。

任何人都可以提供一个提示来解决这个问题吗?

这里是表和查询

CREATE TABLE `messages` (
    `id` int(10) unsigned NOT NULL auto_increment, 
    `user_id` int(10) unsigned NOT NULL default '0', 
    `dest` varchar(20) character set latin1 default NULL, 
    `body` text character set latin1, 
    `sent_on` timestamp NOT NULL default CURRENT_TIMESTAMP, 
    `md5` varchar(32) character set latin1 NOT NULL default '', 
    `interface` enum('mobile','desktop') default NULL, 
    PRIMARY KEY (`id`), 
    KEY `user_id` (`user_id`), 
    KEY `md5` (`md5`), 
    FULLTEXT KEY `dest` (`dest`,`body`), 
    FULLTEXT KEY `body` (`body`) 
) ENGINE=MyISAM AUTO_INCREMENT=7074256 DEFAULT CHARSET=utf8 

的SQL和这里查询:

EXPLAIN SELECT SQL_CALC_FOUND_ROWS id, sent_on, dest AS who, body,interface FROM messages WHERE user_id = 2 ORDER BY sent_on DESC LIMIT 0,50 \G; 
*************************** 1. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: messages 
     type: ref 
possible_keys: user_id 
      key: user_id 
     key_len: 4 
      ref: const 
     rows: 13997 
     Extra: Using where; Using filesort 
1 row in set (0.00 sec) 

回答

0

注意,在你的EXPLAIN输出如下:

Extra: Using where; Using filesort 

Using filesort意味着MySQL正在倾倒查询结果到文件进行排序,然后再读取结果以获得前50行。

虽然我不是专家,但我认为你可以通过提供一个能够同时满足选择标准和排序顺序的索引来优化这个过程;那么选择和排序可以仅通过索引扫描来确定,而不必每次对结果集进行排序。

在这种情况下,您的WHERE位于user_id,您的ORDER BY位于sent_on。因此,理论上,如果您在这两列上按顺序提供单个索引,那么引擎将能够使用索引的前半部分来过滤结果,并且由于索引的后半部分处于打开状态在sent_on列中,索引结果将按照该列的顺序排列,从而允许MySQL简单检索该索引的前50个结果。不需要额外的排序。

声明:我不是DBA。我可能完全错误。

另请参见:Mysql.com: Multiple Column Indexes

+0

它可能是一个解决方案,我只需要添加一个索引(user_id,sent_on)? – n0cturnal 2010-11-21 16:03:32

+0

尝试一下,看看它是否有帮助。 ; -P – tylerl 2010-11-22 01:21:57

+0

fially我加了那个索引,你哪里没错! filesort消失了。非常感谢! – n0cturnal 2010-11-28 09:37:51

0

也许你有残疾Concurrent Inserts

+0

刚才检查...> SHOW VARIABLES LIKE '%并发%'; concurrent_insert | 1 – n0cturnal 2010-11-20 17:30:00

0

ORDER BY会让你减慢吗?我不知道,如果它是一个好主意,指数sent_on,这将取决于SELECT VS INSERT频率

+0

我会尝试这个夜晚,不可能在大型的生产桌上运行如此庞大的查询。但谢谢你,我会报告会发生什么 – n0cturnal 2010-11-21 16:06:16