2012-09-25 99 views
0

我有一個簡單的查詢:爲什麼不使用索引?

SELECT id 
FROM logo 
WHERE (`description` LIKE "%google%" AND `active` = "y") 
ORDER BY id ASC 

logo(MyISAM的)由約30字段與它2402024行形成。 字段description是一個varchar(255)非空。 領域active是一個ENUM( 'Y', 'N'),這些指標不空 基數是:

`active`: BTREE Card. 2 
`description`: BTREE Card. 200168 

EXPLAIN的查詢返回這樣的:

select_type: SIMPLE 
table: logo 
type: ALL 
possible_keys: active 
key: NULL 
key_len: NULL 
ref: NULL 
rows: 2402024 
Extras: Using where 

我想知道爲什麼查詢不使用description索引以及如何優化表格,以便此查詢在沒有全表掃描的情況下順利運行

已經優化了表格並檢查了錯誤..

+1

sql引擎只能使用'starts-with'索引,所以'google%'將使用索引。在字段中查找子字符串會強制引擎進行全表掃描。 – rene

+0

無論如何,我可以修改表加快查詢?也許分區? – Fabrizio

+1

你最好用全文搜索的東西... http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html – rene

回答

2

鑑於您的LIKE條件的%在被比較的表達式的開始和結尾處,索引在此上下文中沒有用處。

僅當比較表達式可以按照「有序」方式找到時纔有用,例如A在B之前,即在C之前。換句話說,LIKE 'google%'可以使用索引,而LIKE '%google%'不會。