我正在使用 mysql 数据库,该数据库只有一个表“data”与 17,151257 行。此表有一列字符串即可。我想打印字符串列包含特定查询字符串的所有行(存储在“entered_query”变量中),所以我使用了以下内容:
SELECT DISTINCT * from data WHERE string LIKE '%".$entered_query."%' limit 10
上面显而易见的是,查询花费了太多时间来执行。
我读过可以使用索引但是在这种情况下怎么样?
我还想过将整个数据划分为10个不同的行,然后使用 perl DBI 执行10个并行查询。
现在我有以下问题:
答案 0 :(得分:9)
常规索引不能用于改进该查询。 MySQL索引是B树,这意味着它们可以非常快速地找到索引列的前缀。但由于您的LIKE
查询在开头有%
,因此没有唯一的前缀可供搜索。因此,必须扫描每一行以匹配模式。
但是,MySQL也支持全文搜索。这将创建列中所有单词的索引,并且可以快速找到这些单词。有关详细信息,请参阅documentation。
如果您使用LIMIT 10
,它会在找到满足条件的前10行时立即停止扫描。除非您还使用ORDER BY
- 否则它必须找到所有行,以便在选择前10行之前对它们进行排序。