【问题标题】:Mysql table or query optimisationMysql 表或查询优化
【发布时间】:2012-04-10 06:42:46
【问题描述】:

我正在运行以下查询,但是我更改了它,它仍然需要将近 5 秒才能运行,这是完全不可接受的......

查询:

SELECT cat1, cat2, cat3, PRid, title, genre, artist, author, actors, imageURL, 
lowprice, highprice, prodcatID, description
from products
where title like '%' AND imageURL <> '' AND cat1 = 'Clothing and accessories'
order by userrating desc
limit 500

我试过去掉“like %”,去掉“imageURl ''”,但还是一样。我试过只返回 1 列,还是一样。

我对表中几乎每一列都有索引,当然查询中提到的所有列。

这基本上是针对类别列表的。如果我对具有全文索引的标题列中的内容进行全文搜索,则只需不到一秒的时间。

我是否应该向 cat1 列添加另一个全文索引并将查询焦点更改为该列上的“匹配”?

我是不是期待太多了?

该表只有不到 300 万行。

【问题讨论】:

  • 你能给我们看看表架构吗
  • 300 万行表和几乎每一列的索引.. 这不好。

标签: mysql sql full-text-search


【解决方案1】:

你说你对每一列都有一个索引。有没有索引之类的?

alter table products add index (cat1, userrating)

如果您不这样做,请尝试一下。运行该查询并让我知道它是否运行得更快。

另外,我假设您实际上是在标题、字段上设置某种过滤器而不是 %,对吧?

【讨论】:

  • 它仍然不够出色,但将时间缩短了一半以上 - 谢谢!
【解决方案2】:

您应该将 cat1 作为整数,然后在这 300 万行中使用字符串。您还必须正确索引。如果索引所有列只得到改进,那么这将是系统默认做的事情。

除此之外,title LIKE '%' 什么也不做。我猜你用它来搜索所以它变成了`title LIKE 'search%'

您是否使用任何类型的框架来获取此信息?如果你的框架将它保存到一个大数组中,那么获得 500 行和很多列可能会耗尽系统。可能不是这样,但是:
尝试运行普通的$query = mysql_query()while($row = mysql_fetch_object($query))

【讨论】:

    【解决方案3】:

    我建议添加一个包含查询列的索引:title、imageURL 和 cat1。 第二个改进:使用SQL服务器缓存,它会致命地提高速度。 最后的改进:如果你查询总是这样,只有值改变,然后使用准备好的语句。

    【讨论】:

      【解决方案4】:

      好吧,我很确定 % 作为 LIKE 子句中的第一个字符,会为您提供对该列的全表扫描(在您的情况下,您不会执行全表扫描,因为您AND 子句中已经有限制子句)。 除此之外,尝试在 cat1 列上添加索引。此外,尝试向您的查询添加其他条件,以减少数据集的大小 - 您的工作数据集(与您的查询匹配的行数,没有 LIMIT 子句)也可能太大。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-06-02
        • 2016-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-05
        • 1970-01-01
        相关资源
        最近更新 更多