【问题标题】:php + mysql: finding all rows that contain string "ABC" in some fieldphp + mysql:在某个字段中查找包含字符串“ABC”的所有行
【发布时间】:2012-06-02 12:31:03
【问题描述】:

我对这些东西比较陌生,所以如果问题是转储,请原谅。假设一个包含字段的表: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 仅包含用冒号分隔的数字。

【问题讨论】:

  • 字段是否有固定的格式,比如用冒号隔开的四个小数字?或者它可以包含任意文本,包括字母和符号?如果字段包含“172”,“17”应该匹配吗?
  • 只是用冒号分隔的数字
  • 数字大小有限制吗?数字数量有限制吗?

标签: php mysql indexing


【解决方案1】:

如果表中有大量行,查询可能会很慢。问题来了:如果我对 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 列。如果您认为自己永远不需要它,那么您不需要在表格中包含此列。

【讨论】:

  • field_str 中可以有任意数量的冒号,所以我不能将整数存储在单独的列中
  • 他建议将每个整数放在单独的行中,而不是单独的列中。在数据库列中搜索任何类型的分隔数据是非常低效的。
【解决方案2】:

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

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

【讨论】:

  • 是的,我知道搜索值会更快。不过,这不是我的情况
【解决方案3】:

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

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

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

% 是一个小丑字符,意思是一个或多个字符

【讨论】:

  • 会比使用INSTR(str_field, '17')>0更快吗?
  • 我认为是的,因为instr 返回一个值,该值从字符串开始搜索,而我运行的语句只检查是否存在。但我认为这两个命令之间的性能影响不会那么大。我将在本地机器上尝试一些测试。
  • 实际上,该查询将包括str_field 具有类似12:4179:1246:90 的值的行。
  • @Kjir 肯定的。就像 Eugeny89 使用的查询一样。就获取的结果而言,使用 INSTR(str_field, '17')>0str_field LIKE '%17%' 是等效的。
  • 没错,但我仍然认为这不是预期的。虽然只有 Eugeny89 知道真正需要什么......
猜你喜欢
  • 1970-01-01
  • 2014-10-11
  • 2013-05-13
  • 1970-01-01
  • 1970-01-01
  • 2019-06-30
  • 1970-01-01
  • 1970-01-01
  • 2014-05-25
相关资源
最近更新 更多