1

我正在运行以下查询,但是我更改了它,它仍然需要将近 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 万行。

4

4 回答 4

1

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

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

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

于 2012-04-10T06:49:27.850 回答
1

你说你在每一列都有一个索引。你有索引吗?

alter table products add index (cat1, userrating)

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

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

于 2012-04-10T06:52:15.680 回答
0

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

于 2012-04-10T06:49:33.400 回答
0

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

于 2012-04-10T06:53:47.317 回答