我有一个大的mysql表(大约5M行),我经常插入数据。
这个表是相同的,我必须从中读取数据,有时整个数据库因为在有许多挂起插入时选择数据而变慢。
我在WHERE语句中使用的每个字段上放置索引,所以我真的不知道为什么选择变得这么慢。
有人能提供一些解决这个问题的提示吗?
这是表和查询的SQL
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
这里是查询:
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 :(得分:0)
也许您已停用Concurrent Inserts?
答案 1 :(得分:0)
ORDER BY会减慢你的速度吗?我不知道索引sent_on是否是一个好主意,它将取决于SELECT vs INSERT频率
答案 2 :(得分:0)
请注意EXPLAIN
输出中的以下内容:
Extra: Using where; Using filesort
Using filesort
表示MySQL正在将查询结果转储到文件中进行排序,然后重新读取结果以获得前50行。
虽然我不是专家,但我认为你可以通过提供一个既能满足选择标准又能满足排序顺序的索引来优化这个过程。那么选择和排序只能通过索引扫描来确定,而不必每次都对结果集进行排序。
在这种情况下,WHERE
位于user_id
,ORDER BY
位于sent_on
。所以,理论上,如果你在这两列上提供一个索引(按此顺序),那么引擎将能够使用索引的前半部分来过滤结果,并且因为索引的后半部分是打开的在sent_on
列中,索引结果将根据该列按顺序排列,从而允许MySQL简单地从该索引中检索前50个结果。无需额外的分类。
免责声明:我不是DBA。我可能完全错了。