【发布时间】:2013-05-11 05:40:40
【问题描述】:
我有一个包含 3 亿行(并且还在增长)的表 (location_data)。
我想为 foo_id 的特定值找到最新条目的 ID (MAX(id))。
- 下面的查询是最优的吗?这通常需要几秒钟。
- “rows”值 561826 是否意味着 MySQL 正在读取并扫描 foo_id 的所有行,尽管它应该能够使用复合索引立即跳转到 foo_id 的最后一个 id?李>
- 为什么“keylen”4 是由两个 32 位整数组成的?
最重要的是,如何加快查询速度?
mysql> explain
-> SELECT foo_id, MAX(id) id
-> FROM location_data l
-> WHERE l.foo_id = 253
-> GROUP BY foo_id;
+----+-------------+-------+------+---------------+---------+---------+-------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+---------+---------+-------+--------+-------------+
| 1 | SIMPLE | l | ref | Index 5 | Index 5 | 4 | const | 561826 | Using index |
+----+-------------+-------+------+---------------+---------+---------+-------+--------+-------------+
1 row in set (0.00 sec)
mysql> SHOW CREATE TABLE bar.location_data;
...
CREATE TABLE `location_data` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`foo_id` int(11) NOT NULL,
`ts_lastpos` datetime DEFAULT NULL,
`lat` double NOT NULL,
`lng` double NOT NULL,
PRIMARY KEY (`id`),
KEY `Index 5` (`foo_id`,`id`)
) ENGINE=MyISAM AUTO_INCREMENT=562767448 DEFAULT CHARSET=latin1
...
1 row in set (0.00 sec)
【问题讨论】:
-
谢谢,user4035 - 这就是答案 - “分组依据”导致 0.5M 记录被读取。如果您将其格式化为答案,我会接受。
标签: mysql max composite-index