【问题标题】:Confused about mysql looking at half a million rows when using an index对mysql在使用索引时查看半百万行感到困惑
【发布时间】: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


【解决方案1】:

我试过这个:

SELECT MAX(id) id 
FROM location_data l   
WHERE l.foo_id = 2;

对于适当的 l.foo_id,结果仍然是 MAX(id)。无需检索 foo_id,因为您在查询之前已经知道它。

我一删除GROUP BY,EXPLAIN 就开始给出这个:

mysql> EXPLAIN SELECT MAX(id) id
    -> FROM location_data l
    -> WHERE l.foo_id = 2\G
*************************** 1. row **********************
           id: 1
  select_type: SIMPLE
        table: NULL
         type: NULL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: NULL
        Extra: Select tables optimized away
1 row in set (0.00 sec)

这意味着您已经完成了一个查询,该查询仅计算 表中的行数,并且该表是 MyISAM 表。 MyISAM 表以单独的行数存储,因此要执行此查询 MySQL 根本不需要查看任何表格行数据。取而代之的是 立即返回预先计算的行数。因此表 访问已“优化”,查询速度极快。

Meaning of "Select tables optimized away" in MySQL Explain plan

所以,我认为,去掉 GROUP BY 会加快您的查询速度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多