mysql 发送数据的时间太长

rlc*_*ral 11 mysql performance

我有一个包含数百万条记录(14,000,000)的简单表,对于一个简单的查询,它花费了太多时间“发送数据”。

桌子

CREATE TABLE IF NOT EXISTS details (
  id int(11) NOT NULL,
  date date NOT NULL,
  time int(2) NOT NULL,
  minutes_online decimal(5,0) NOT NULL,
  minutes_playing decimal(5,0) NOT NULL,
  minutes_chatting decimal(5,0) NOT NULL,
  minutes_away decimal(5,0) NOT NULL
  PRIMARY KEY (id,date,time)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
Run Code Online (Sandbox Code Playgroud)

简单的查询

mysql> SELECT * FROM details WHERE id = 3014595;
Run Code Online (Sandbox Code Playgroud)

解释

mysql> EXPLAIN SELECT * FROM details WHERE id = 3014595;
+----+-------------+-----------+------+---------------+---------+---------+-------+------+-------+
| id | select_type | table     | type | possible_keys | key     | key_len | ref   | rows | Extra |
+----+-------------+-----------+------+---------------+---------+---------+-------+------+-------+
|  1 | SIMPLE      | details   | ref  | PRIMARY       | PRIMARY | 4       | const | 1482 |       |
+----+-------------+-----------+------+---------------+---------+---------+-------+------+-------+
Run Code Online (Sandbox Code Playgroud)

查询的配置文件

mysql> SHOW PROFILE FOR QUERY 1;
+--------------------------------+----------+
| Status                         | Duration |
+--------------------------------+----------+
| starting                       | 0.000024 |
| checking query cache for query | 0.000078 |
| checking permissions           | 0.000014 |
| Opening tables                 | 0.000126 |
| System lock                    | 0.000011 |
| Table lock                     | 0.000030 |
| init                           | 0.000027 |
| optimizing                     | 0.000117 |
| statistics                     | 0.040077 |
| preparing                      | 0.000029 |
| executing                      | 0.000006 |
| Sending data                   | 7.536960 |
| end                            | 0.000013 |
| query end                      | 0.000004 |
| freeing items                  | 0.000037 |
| storing result in query cache  | 0.000006 |
| logging slow query             | 0.000003 |
| cleaning up                    | 0.000006 |
+--------------------------------+----------+
Run Code Online (Sandbox Code Playgroud)

如您所见,该SELECT语句使用了索引并且只读取了 1482 行。然而,查询花费了 7.536960 秒发送数据。这就像查询读取了它需要的更多行。

这是一个简单的查询,只有 7 个字段(行平均 59 字节)并且没有花哨的功能。知道是什么原因造成的吗?

注意:id 是用户 ID。每个用户每天的每个小时可能至少有一个条目。因此,id 不是唯一的。

编辑:我有另一个具有相同结构和更多行(3400 万)的表。如果我在这个更大的表上运行相同的查询,它会在不到 1 秒的时间内返回结果。

唯一的区别是较大的表不会获得与较小表一样多的查询。

  • 查询数量是否有可能减慢进程?MySQL 缓存已打开。我还使用 CakePHP 缓存查询以减少查询数量。
  • 是否有可能保存表的文件已损坏或什么?

更新 通过将数据层与 Web 层分离来解决该问题。数据层的 RAM 也得到了升级,并在 raid10 上运行。

小智 -3

为 id 创建单独的索引:

更改表详细信息添加键 d1(id);

要使该索引生效,请重新启动 MySQL 或

分析表格详细信息;

如果可能的话,您还可以将数据库更改为 InnoDB,以获得事务支持和其他好处。