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

r.b*_*waj 6 mysql sql perl dbi

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

Bar*_*mar 10

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

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

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