2014-07-11 65 views
0

我在具有mobileno列的表上使用sql查詢mobileno包含「 - 」,因此在where子句中我需要使用replace(mobileno,「 - 」,「」)函數進行比較。
隨着解釋函數我檢查,它不使用索引如果函數被用於索引列。那麼我怎麼能強制SQL使用索引或任何其他替代方案來提高我的查詢性能。當在索引列上使用替換函數時,不使用索引

+0

是的,這是不會,而你在哪裏使用這種字符串函數的使用索引子句,這與在where子句中使用日期函數相同。您可能需要在表中創建一個附加列來保留這些數字 - 併爲該列編制索引或更新現有表,然後在該列上運行查詢。 –

+0

是的,我們也在想同樣的事情,但數據庫非常龐大,這將是一個重大變化,除此之外沒有別的辦法。 – Krishna

+0

我不這麼認爲,但你可以看看正則表達式,如果有幫助,但我懷疑它會。 –

回答

0

您確定因爲REPLACE功能而沒有使用索引嗎?也許沒有足夠的行來使用索引值得。或者其他原因。

我跑了4256行,讓我吃驚的測試,索引使用,甚至將其替換:

EXPLAIN EXTENDED SELECT mobileno FROM test WHERE REPLACE(mobileno, '(', '') = '123) 456-789' 

id select_type table type possible_keys key   key_len ref  rows filtered Extra 
1 SIMPLE  test index NULL   mobileno 768  NULL 4256 100   "Using where; Using index"