我对这个东西比较新,所以如果问题是转储请原谅。假设一个表有字段: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 即可。换句话说,我问:索引是否增加了像
这样的查询的speadSELECT * FROM `table_name` WHERE str_field='value'
UPD str_field仅包含以冒号分隔的数字。
答案 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%';
%
是一个小丑角色,意思是一个或多个角色。