【问题标题】:If data is less than set limit, taking too much time如果数据小于设定的限制,花费太多时间
【发布时间】:2016-11-17 06:52:40
【问题描述】:

我有一个有 200K 行的表。当我执行查询时,它花费了太多时间;大约 2 分钟。

这是我的查询:

SELECT a,b,c,d,@row:="tag1" as tag 
  FROM tableName
 WHERE tagName like "%helloworld|%"
 ORDER BY viewCount desc
  LIMIT 20;

helloworld| 仅出现在 2 行中。

我想更改查询,所以如果数据出现超过 20 次,它应该返回 20 行,否则无论出现什么行。

如何优化这个查询?

【问题讨论】:

  • 运行全表扫描。尝试全文搜索
  • 您需要创建带有标签的单独表才能在没有全扫描的情况下进行过滤。
  • tagName 列上尝试全文索引以及MATCH AGAINST,即:WHERE MATCH(tagName) AGAINST('helloworld|' IN BOOLEAN MODE)
  • 阅读本文——可搜索查询是可以利用索引的查询。你的不能。 stackoverflow.com/questions/799584/…
  • 除非您的行非常宽或者您使用的计算机速度非常慢,否则扫描 200,000 行应该需要几秒钟,而不是几分钟。

标签: mysql sql database mariasql


【解决方案1】:

试试这些

  1. 在表的搜索字段上设置索引,然后检查查询执行时间
  2. 不确定这里的 viewCount 是什么,但我猜你是通过子查询得到的尝试删除订单语句然后检查查询执行时间

【讨论】:

    【解决方案2】:

    您无法按照书面规定加快速度。

    带有 LIKE 的 WHERE 子句要求您扫描每一行。它是 O(N),其中 N = 表中的行数。随着表大小的增加,它会运行得更慢。

    如果您能找到一种方法将该字符串解析为可以作为列和索引插入的标记,则可以使查询运行得更快。

    【讨论】:

      猜你喜欢
      • 2023-03-17
      • 1970-01-01
      • 2016-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      相关资源
      最近更新 更多