无论如何都可以从中获得更好的表现。
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 |
+----+-------------+-----------+------+---------------+---------+---------+-------+------+-------------+
如何加快此查询?
答案 0 :(得分:2)
在您的示例中,您执行的是SELECT *
,但您只有一个包含sec
和date
列的INDEX。
结果,MySQL的执行计划大致如下所示:
sec = 0P00009S33
的所有行。这很快。date
对所有返回的行进行排序。这也可能很快,具体取决于MySQL缓冲区的大小。 optimizing the sort_buffer_size
可能还有改进的余地。您可以通过将SELECTed字段减少到最小来大幅优化。示例:如果您只需要open
价格,请只使用SELECT sec, date, open
代替SELECT *
。
当您确定需要查询的最小列时,添加一个包含这些列的组合INDEX(涉及的所有列 - 在WHERE
,SELECT
或ORDER BY
子句中< / p>
这样你可以完全跳过这个查询的慢速部分,(3)在上面的例子中。当INDEX已包含所有必需的列时,MySQL优化器可以避免查找完整列并直接从INDEX提供查询。
免责声明:我不确定MySQL执行步骤的顺序,可能是我订购(2)和(3)错误的方式。但是,回答这个问题并不重要。