2010-10-20 44 views
0

我正在調整我的mysql查詢。 架構具有USER_ID的索引(以下..) 但不使用索引。爲什麼?爲什麼我的mysql不使用索引?

ENV: MySQL4.0.27,MyISAM數據

SQL如下:

SELECT type,SUM(value_a) A, SUM(value_b) B, SUM(value_c) C 
FROM big_record_table 
WHERE user_id='<user_id>' 
GROUP BY type 

解釋:

|table |type |possible_keys |key |key_len |ref |rows |Extra| 

|big_record_table| ALL| user_id_key|||| 1059756 |Using where; Using temporary; Using filesort| 

你可以描述細節?

方案如下:

CREATE TABLE `big_record_table` (
`user_id` int(11) NOT NULL default '0', 
`type` enum('type_a','type_b','type_c') NOT NULL default 'type_a', 
`value_a` bigint(20) NOT NULL default '0', 
`value_b` bigint(20) default NULL, 
`value_c` bigint(20) NOT NULL default '0', 
KEY `user_id_key` (`user_id`) 
) TYPE=MyISAM 
+0

你可以張貼'SHOW的輸出CREATE TABLE big_record_table'好嗎? – 2010-10-20 03:28:38

+0

謝謝回覆脫穎而出書面.I've SHOW CREATE TABLE big_record_table – freddiefujiwara 2010-10-20 04:52:09

+0

多少記錄已被此查詢閱讀? – zerkms 2010-10-20 05:05:00

回答

0

首先,我們看不到你的索引聲明方式。你能得到表格的轉儲嗎?在PostgreSQL中,你會使用pg_dump,但我不知道如何在MySQL中。你有沒有在桌子上做過分析?

+0

謝謝。是的,我已經ANALYZEd – freddiefujiwara 2010-10-20 03:02:10

+0

好,但是桌面佈局呢。我不明白你的索引是如何定義的。你在big_record_table上創建了一個索引嗎?這個索引究竟是如何創建的? – 2010-10-20 03:04:29

+0

我寫過這個方案。你能給我爲什麼嗎?我應該閱讀mysql優化器的源代碼嗎? – freddiefujiwara 2010-10-20 03:09:00

1

我的猜測是typeuser_id不是indexed

只是將運行。你沒有太多的玩法。

+0

謝謝你的回覆。但我想得到爲什麼只有user_id不行? – freddiefujiwara 2010-10-20 03:02:49

+0

@ffffff你正在用'type'進行分組。如果你用'user_id'得到了一大堆結果,他們都必須閱讀才能找出不同的類型。 – Frankie 2010-10-20 03:11:40

+0

非常感謝!如果你知道列出的文件。我很高興 – freddiefujiwara 2010-10-20 03:18:38

0

這可能是隱式類型轉換阻止索引被使用。您已將user_id定義爲int,但在查詢中指定了一個字符串。這使MySQL可以選擇將查詢中的字符串轉換爲int(這可能不準確) - 或者將數據庫中的每個user_id轉換爲字符串,以便與查詢中的字符串進行比較。

簡短的回答:嘗試在查詢

SELECT type,SUM(value_a) A, SUM(value_b) B, SUM(value_c) C 
FROM big_record_table 
WHERE user_id=123 
GROUP BY type 

(其中123替換爲正確的用戶ID)去除引號。