1

我对这些东西比较陌生,所以如果问题是转储,请原谅。假设一个包含字段的表: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 会增加查询执行的速度吗?

先感谢您!

附言。换句话说,我在问:索引是否会增加查询的速度,例如

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

?

UPD str_field 仅包含用冒号分隔的数字。

4

3 回答 3

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此查询不需要该列。如果您认为您永远不需要它,那么您不需要在表格中包含此列。

于 2012-06-02T12:45:42.997 回答
3

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

尽管如此,搜索值而不是表达式要快得多......

于 2012-06-02T12:35:56.317 回答
2

索引可以提高性能,这是真的。

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

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

%是一个小丑字符,表示一个或多个字符

于 2012-06-02T12:47:00.757 回答