2016-11-19 65 views
0

我有一個MySQL表的主鍵:沒有索引 - 但列被編

CREATE TABLE `members` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
`type` char(1) , 
    `status` char(1) , 
    `enable` char(1), 
    `club` int(10) unsigned NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=3714 DEFAULT CHARSET=utf8 ; 

如果我做下面的查詢

SELECT * FROM members WHERE club='adfsd'; 

我得到一個Mysqli的'查詢/準備聲明中沒有使用索引'警告。這是公平的 - 我真的應該有一個索引。然後,我在俱樂部

KEY `club` (`club`) 

該指數是由添加索引 - 我可以看到它通過一個形容,但我做的SELECT查詢,我得到了同樣的「使用索引...」警告。

所以我改變了INDEXNAME的東西從列不同的名稱

KEY `clubind` (`club`) 

和查詢工作沒有警告。

如果我在其中一個列上創建索引,說'狀態'並使用'status'作爲索引名稱,並使用查詢中的列,則所有內容都按預期工作。

唯一不同的是我能看到的是有問題的列是一個整數,其他的是字符。

+0

'club int(10)unsigned NOT NULL' ...你看到這裏有什麼問題嗎?你正在比較一個int列和一個字符串。 –

+0

我投票結束這個問題是因爲一個簡單的印刷錯誤。 –

+0

我的示例查詢是誤導性的 - 我在示例中輸入錯誤,因爲我正在使用預準備語句。查詢總是使用一個整數。問題在於,爲什麼查詢在索引名稱與列名稱不同時沒有「未使用索引...」警告時工作 - 與查詢帶有字符串的整數列無關。 – user1199529

回答

0

您已聲明club是一個整數。

您所查詢的是:

SELECT * FROM members WHERE club = 'adfsd'; 

混合數據類型,往往阻礙指標被使用。

另外,查詢中是否使用索引取決於表的大小。即使對於適當的查詢,索引的存在並不總是意味着它將被使用。

+0

downvote有沒有原因?我認爲解釋是正確的。 –

+0

好吧,我的例子可能是誤導性的,我使用了準備好的語句,字段綁定將是一個整數。所以如果查詢是 SELECT * FROM members WHERE club ='11'; 我仍然得到'沒有使用索引..'的警告。我的觀點是,當索引名稱與列名稱相同時,查詢不會發出警告,但在索引名稱與列名稱不同時可以正常工作。 – user1199529

+0

@ user1199529。 。 。如果「俱樂部」是一個數字,不要將它與一個字符串進行比較。 –