php + mysql:在某些字段中查找包含字符串“ABC”的所有行

时间:2012-06-02 12:31:03

标签: php mysql indexing

我对这个东西比较新,所以如果问题是转储请原谅。假设一个表有字段:id,str_field。 str_field的值类似于“12:17:1246:90”。我想得到str_field包含的所有行,例如“17”。为此,我需要执行以下命令

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仅包含以冒号分隔的数字。

3 个答案:

答案 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列。如果您认为自己不需要它,那么您不需要在表格中包含此列。

答案 1 :(得分:3)

您可以创建全文索引并使用特殊的MATCH功能:http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

仍然,搜索值而不是表达式要快得多......

答案 2 :(得分:2)

索引可以提高性能,这是事实。

如果您的字段包含12:17:1246:90等字符串数据,则可以使用查询

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

%是一个小丑角色,意思是一个或多个角色