6

我正在使用mysql数据库,它只有一个表“数据”,有17,151257行。这个表有一个列字符串。我想打印字符串列包含特定查询字符串(存储在“entered_query”变量中)的所有行,所以我使用了以下内容:

SELECT DISTINCT * from data WHERE string LIKE '%".$entered_query."%' limit 10

很明显,上面的查询花费了太多时间来执行。

我已经读过可以使用索引,但是在这种情况下如何使用?
我还想过将整个数据分成 10 个不同的行,然后使用
perl DBI执行 10 个并行查询。

现在我有以下问题:

  1. 如何减少执行时间?
  2. 我听说 mysql 查询中的“LIKE”避免了索引,所以对于上述查询有没有更好的选择?
  3. 当我们在 mysql 查询中使用限制 10 时,mysql 会在找到前 10 个结果后立即停止执行,或者首先搜索给定查询的整个数据,然后返回前 10 个结果
4

1 回答 1

10

常规索引不能用于改进该查询。MySQL 索引是 B 树,这意味着它们可以非常快速地找到索引列的前缀。但是由于您的LIKE查询%以开头,因此没有要搜索的唯一前缀。因此,必须扫描每一行以匹配模式。

但是,MySQL 也支持全文搜索。这将创建列中所有单词的索引,并且可以快速找到这些单词。有关详细信息,请参阅文档

如果使用LIMIT 10,它将在找到满足条件的前 10 行后立即停止扫描。除非您也使用ORDER BY-- 否则它必须找到所有行,以便在选择前 10 行之前对其进行排序。

于 2013-07-09T05:54:15.777 回答