2014-02-24 93 views
0

有沒有辦法獲得更好的性能。簡單查詢在Mysql中緩慢

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

查詢花了0.1578秒。

表結構如下所示。該表中有超過100百萬條記錄。

+------------------+---------------+------+-----+---------+-------+ 
| 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 | 
+----+-------------+-----------+------+---------------+---------+---------+-------+------+-------------+ 

我如何可以加快此查詢?

+2

索引字段秒 –

+0

你預計它有多快?對於這樣的查詢,150毫秒對我來說聽起來不那麼糟糕。該查詢返回了多少行? –

+0

你在抱怨,因爲0.1578秒很慢? – rationalboss

回答

2

在你的例子中,你做了一個SELECT *,但是你只有一個包含secdate列的INDEX。

在結果,MySQLs執行計劃大致如下所示:

  1. 發現在INDEX有sec = 0P00009S33所有行。這很快。
  2. date對所有返回的行進行排序。這也可能很快,這取決於MySQL緩衝區的大小。這裏可能有改進空間optimizing the sort_buffer_size
  3. 從先前的INDEX查詢中爲每個返回的行提取所有列(=全行)。這很慢!請參閱(1)

您可以通過將SELECTed字段減小到最小來對其進行大幅優化。示例:如果您只需要open價格,則只需執行SELECT sec, date, open而不是SELECT *

當您確定您需要查詢的最小列,添加一個組合索引完全包含這些colums(所涉及的所有列 - 在WHERESELECTORDER BY子句中)

這樣你就可以完全跳過慢這個查詢的一部分,(3)在我上面的例子中。當INDEX已經包含所有必要的列時,MySQL優化器可以避免查找完整的列並直接從INDEX提供查詢。

聲明:我不確定MySQL執行哪些步驟的步驟,可能我命令(2)和(3)以錯誤的方式。但是,這對於回答這個問題並不重要。