在Mysql中简单查询速度慢

时间:2014-02-24 15:43:08

标签: mysql sql performance

无论如何都可以从中获得更好的表现。

select * from p_all where sec='0P00009S33' order by date desc

查询耗时0.1578秒。

表结构如下所示。此表中有超过1亿条记录。

+------------------+---------------+------+-----+---------+-------+
| Field            | Type          | Null | Key | Default | Extra |
+------------------+---------------+------+-----+---------+-------+
| sec              | varchar(10)   | NO   | PRI | NULL    |       |
| date             | date          | NO   | PRI | NULL    |       |
| open             | decimal(13,3) | NO   |     | NULL    |       |
| high             | decimal(13,3) | NO   |     | NULL    |       |
| low              | decimal(13,3) | NO   |     | NULL    |       |
| close            | decimal(13,3) | NO   |     | NULL    |       |
| volume           | decimal(13,3) | NO   |     | NULL    |       |
| unadjusted_close | decimal(13,3) | NO   |     | NULL    |       |
+------------------+---------------+------+-----+---------+-------+

EXPLAIN结果

+----+-------------+-----------+------+---------------+---------+---------+-------+------+-------------+
| id | select_type | table     | type | possible_keys | key     | key_len | ref   | rows | Extra       |
+----+-------------+-----------+------+---------------+---------+---------+-------+------+-------------+
|  1 | SIMPLE      | price_all | ref  | PRIMARY       | PRIMARY | 12      | const | 1731 | Using where |
+----+-------------+-----------+------+---------------+---------+---------+-------+------+-------------+

如何加快此查询?

1 个答案:

答案 0 :(得分:2)

在您的示例中,您执行的是SELECT *,但您只有一个包含secdate列的INDEX。

结果,MySQL的执行计划大致如下所示:

  1. 查找INDEX中sec = 0P00009S33的所有行。这很快。
  2. date对所有返回的行进行排序。这也可能很快,具体取决于MySQL缓冲区的大小。 optimizing the sort_buffer_size可能还有改进的余地。
  3. 从上一个INDEX查询中获取每个返回行的所有列(=完整行)。这很慢!见(1)
  4. 您可以通过将SELECTed字段减少到最小来大幅优化。示例:如果您只需要open价格,请只使用SELECT sec, date, open代替SELECT *

    当您确定需要查询的最小列时,添加一个包含这些列的组合INDEX(涉及的所有列 - 在WHERESELECTORDER BY子句中< / p>

    这样你可以完全跳过这个查询的慢速部分,(3)在上面的例子中。当INDEX已包含所有必需的列时,MySQL优化器可以避免查找完整列并直接从INDEX提供查询。

    免责声明:我不确定MySQL执行步骤的顺序,可能是我订购(2)和(3)错误的方式。但是,回答这个问题并不重要。