2013-02-20 92 views
0

我有〜1,500,000記錄的表:上name簡單有序的MySQL查詢運行很慢上一大桌

CREATE TABLE `item_locale` (
    `item_id` bigint(20) NOT NULL, 
    `language` int(11) NOT NULL, 
    `name` varchar(256) COLLATE utf8_czech_ci NOT NULL, 
    `text` text COLLATE utf8_czech_ci) 
    PRIMARY KEY (`item_id`,`language`), 
    KEY `name` (`name`(255)) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; 

隨着item_idlanguage作爲主鍵和索引的大小爲255

用下面的查詢:

select item_id, name from item_locale order by name limit 50; 

的選擇需要3秒左右的事件,雖然只要求50行。

我能做些什麼來加快這樣的查詢?

編輯:你們中的一些人建議添加一個INDEX。我上面提到的,該name列索引的大小爲255

我就拼命地跑命令explain

+----+-------------+---------------+------+---------------+------+---------+------+---------+----------------+ 
| id | select_type | table   | type | possible_keys | key | key_len | ref | rows | Extra   | 
+----+-------------+---------------+------+---------------+------+---------+------+---------+----------------+ 
| 1 | SIMPLE  | item_locale | ALL | NULL   | NULL | NULL | NULL | 1558653 | Using filesort | 
+----+-------------+---------------+------+---------------+------+---------+------+---------+----------------+ 

奇怪的是,它似乎沒有使用任何索引...

+1

使用'EXPLAIN'查看MySQL如何執行您的查詢。 – 2013-02-20 12:41:31

+0

一個簡單的解決方案是在item_id和name上添加一個覆蓋索引。根據MySQL處理組合索引的方式,單獨在'name'上添加一個索引就足夠了*(讀作:我不知道)* – 2013-02-20 12:45:37

+0

我添加了explain命令的結果。 – 2013-02-20 13:09:45

回答

1

在盡頭,有某種問題與指標 - 我放棄了所有這些,再重新創建它們。它終於有效。謝謝。

1

檢索50條記錄也較重。將它們限制爲10因爲您也在使用Order ..

+4

將其限制爲0,它甚至會更快。嚴重的是,檢索50條記錄不應該是問題。 – 2013-02-20 12:43:47

+0

有很多像索引等查詢優化技術請嘗試使用它們,他們將是有益的 – 2013-02-20 13:14:39

1

在名稱字段上應用索引可能會加快一點。

+1

該指數已經在那裏,因爲它在文中提到。 – 2013-02-20 13:09:18

1

嘗試使用查詢提示:

select item_id, name 
from item_locale USE INDEX FOR ORDER BY (name) 
    order by name limit 50; 

也嘗試使用

select item_id, name 
from item_locale FORCE INDEX (name) 
    order by name limit 50; 
+0

沒有效果,仍然很慢,解釋顯示沒有區別。 – 2013-02-20 14:23:21