2012-06-02 66 views
1

我是比較新的這個東西,所以請原諒如果問題是轉儲所有行。假設一個帶有字段:id,str_field的表。 str_field的值類似於「12:17:1246:90」。我想獲取str_field包含的所有行,例如「17」。要做到這一點,我需要執行下面的命令PHP + MYSQL:查找包含字符串「ABC」在某些領域

SELECT id FROM `table_name` WHERE INSTR(str_field, '17')>0 

如果有表中的大量行的查詢可能會很慢。這裏的問題是:如果我將索引str_field它會增加查詢執行的高度?

預先感謝您!

PS。在其他方面,我要問:沒有指數增加spead上的查詢,如

SELECT * FROM `table_name` WHERE str_field='value' 

UPD str_field只包含由冒號分隔的數字。

+0

該字段是否有固定格式,例如由冒號分隔的四個小數字?或者它可以包含任意文字,包括字母和符號?如果該字段包含「172」,應該「17」匹配嗎? –

+0

只用冒號分隔的數字 – Eugeny89

+0

數字的大小是否有限制?數字的數量是否有限制? –

回答

5

如果有一個大量的行查詢表可能會很慢。這裏的問題是:如果我將索引str_field它會增加查詢執行的高度?

並不多。如果在你的表上有許多其他列,那麼你可以讓你使用的列覆蓋索引:(id, str_field)。這會稍微快一點,因爲索引將比原始表小,因此可以更快地讀取。但是它仍然需要指數(而不是整個表進行完全掃描)的全掃描。

但除此之外,您可以使用一種名爲denormalization的方法,通過使用具有三列的單獨表格來存儲單獨的整數,從而提高查詢速度。

parent sortorder value 
1  1   12 
1  2   17 
1  3   1246 
1  4   90 

查詢是這樣的:

SELECT parent AS id 
FROM table_values 
WHERE `value` = 17 

然後,您可以在(value, parent)添加索引這個表,這將加快查詢。需要注意的是sortorder列不需要此查詢。如果你不認爲你會需要它,那麼你不需要在你的表中包含這個列。

+0

'field_str'中可以有任意數量的冒號,因此我不能將整數存儲在單獨的列中 – Eugeny89

+0

他建議將每個整數分別放在一個單獨的列中行,而不是一個單獨的列。在數據庫列中搜索任何類型的分隔數據是非常低效的。 – bobwienholt

2

索引可以提高性能,這是事實。

如果包含了像12:17:1246:90字符串數據的字段,你可以使用查詢

SELECT id FROM `table_name` WHERE `str_field` LIKE '%17%'; 

%是,這意味着一個或多個字符的一個小丑角色。

+0

使用INSTR(str_field,'17')> 0'會更快嗎? – Eugeny89

+0

我想是的,因爲'instr'返回一個字符串開始搜索的值,而我只運行的語句檢查是否存在。但我認爲這兩個命令之間的性能影響不會那麼大。我會在我的本地機器上嘗試一些測試。 – Whisperity

+0

實際上,該查詢將包括行'str_field'具有像'12:4179:1246:90'這樣的值。 – Kjir