2014-09-20 68 views
0

我有一個包含至少60,000行的表。我的查詢僅僅是基本的,它是這樣的:緩慢的SQL執行

SELECT `table`.name, `table`.age, `table`.points 
           FROM table 
           GROUP BY name, age 
           ORDER BY date 
           DESC 
           LIMIT 12 

結果是一樣(12總計,查詢花費1.2211秒),有時甚至還需要2秒只返回12行。

應該做些什麼來使我的查詢更快?

EXPLAIN QUERY:

id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | 
1  Extra  table ALL  NULL   NULL NULL  NULL 65704 Using temporary; Using filesort 
+0

如果你有性能問題,讓MySQL [EXPLAIN](http://dev.mysql.com/doc/refman/5.6/en/explain.html)給你做什麼工作。正如@SteelBrain所指出的那樣:在很多情況下,索引對於提高性能非常重要。請添加您的表的EXPLAIN和CREATE TABLE語句的輸出。 – VMai 2014-09-20 18:24:27

+0

並刪除您的ORDER BY,這與此聲明完全沒有任何意義。 – VMai 2014-09-20 18:25:54

+0

請注意,「points」列中的值不是每個組的最新值。這是一個不確定的。請閱讀[MySQL擴展到GROUP BY](http://dev.mysql.com/doc/refman/5.6/en/group-by-extensions.html)。如果你不能在積分上使用聚合函數,那麼你可以使用子選擇或左連接。 – VMai 2014-09-20 18:32:45

回答

0

您可能希望創建SQL數據庫索引。 如果你使用MySQL,你可以這樣

ALTER TABLE TABLE_NAME ADD INDEX (COLUMN_NAME); 

對於您的情況下創建它們它會像:

ALTER TABLE `table` ADD INDEX (name); 
ALTER TABLE `table` ADD INDEX (age); 
ALTER TABLE `table` ADD INDEX (points); 

你也可能想看看this question

+0

關於(姓名,年齡)的綜合指數可能是一個好主意。 – VMai 2014-09-20 18:21:51

+0

如果用戶僅按名稱搜索或僅按年齡搜索,組合索引「名稱和年齡」是否會起作用? – 2014-09-20 18:25:27

+0

如果僅按名稱搜索,它將起作用,但不能僅按年齡搜索。在這裏我們有兩個列的組合,所以它可以幫助。 – VMai 2014-09-20 18:28:37

1

這對於評論太長了。 日期索引將有所幫助,如果沒有它,它將被強制執行表掃描。 另外什麼是基數的名稱,即不同名稱的數量劃分的行數?如果它低,你可以創建一個表,這些不同的名稱和加入,旨在鬆散索引掃描。 對於開始嘗試綜合指數:

ALTER TABLE t1 ADD KEY indexName (name,age,date) 

有關詳細信息把一個EXPLAIN查詢之前的結果編輯你的問題。