mysql选择查询优化以及mysql中的限制如何工作

时间:2013-07-09 05:48:00

标签: mysql sql perl dbi

我正在使用 mysql 数据库,该数据库只有一个表“data” 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查询中使用limit 10时,mysql会在找到前10个结果后立即停止执行,或者首先搜索给定查询的整个数据然后返回前10个结果

1 个答案:

答案 0 :(得分:9)

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

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

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