【发布时间】:2014-01-02 09:35:48
【问题描述】:
简单的 sql 查询需要 16 秒以上。这是表格。
CREATE TABLE IF NOT EXISTS `udr` (
`userid` int(11) NOT NULL DEFAULT '0',
`time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`upbytes` int(11) NOT NULL DEFAULT '0',
`downbytes` int(11) NOT NULL DEFAULT '0',
`traffictype` int(11) NOT NULL DEFAULT '1',
KEY `userid` (`userid`),
KEY `time` (`time`),
KEY `traffictype` (`traffictype`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
有 1600 万条记录。 (原来有1.41亿,我剪了看看是不是问题)
有问题的查询是(喜欢)
select time,upbytes,downbytes
from udr
where userid = 315533 and
time between '2014-01-01 14:35:28' and '2014-01-02 14:35:28'
我认为问题出在时间部分,所以我删除了时间条件并尝试遵循
select time,upbytes,downbytes from udr where userid = 315533
...
10282 rows in set (19.42 sec)
查询仍然需要 16 秒以上。
这是我的关键配置参数
key_buffer = 32M
max_allowed_packet = 16M
thread_stack = 192K
thread_cache_size = 8
query_cache_limit = 1M
query_cache_size = 16M
没有关于这个的想法。
谢谢
mysql> explain select * from udr where userid = '315533';
+----+-------------+-------+------+---------------+--------+---------+-------+-------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+--------+---------+-------+-------+-------+
| 1 | SIMPLE | udr | ref | userid | userid | 4 | const | 12738 | |
+----+-------------+-------+------+---------------+--------+---------+-------+-------+-------+
1 row in set (0.02 sec)
iotop 报告重磁盘 io。我怀疑 mysql 正在将所有记录检索到内存中。
【问题讨论】:
-
您有一个
time列但查询到datetime? -
使用
explain select并查看输出。可能有些索引没有创建或不工作 -
用户
315533返回多少条记录? -
把引擎换成MyISAM会不会更好?
-
按照已经建议的方式执行
EXPLAIN <your_query>,并以文本形式在您的问题中发布结果
标签: mysql