我正在运行以下查询,但是我更改了它,它仍然需要将近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
我尝试取出“喜欢%”,取出“imageURl&lt;&gt;''”但仍然相同。我试过只返回1个柱子,仍然是相同的。
我在表中几乎每列都有索引,当然是查询中提到的所有列。
这基本上是针对类别列表。如果我在标题栏中搜索具有全文索引的内容的全文搜索,则需要不到一秒的时间。
我应该向列cat1添加另一个全文索引,并将查询焦点更改为该列上的“匹配”吗?
我期待太多了吗?
该表只有300万行。
答案 0 :(得分:1)
您应该将cat1作为整数,然后是这300万行中的字符串。您还必须正确索引。如果索引所有列只是改进了,那么它将是系统默认的事情。
除此之外,title LIKE '%'
没有做任何事情。我猜你用它来搜索,所以它变成了`title LIKE 'search%'
您是否使用任何类型的框架来获取此内容?如果您的框架将此行保存到大型数组,则获取包含大量列的500行可能会耗尽系统。可能不是这样,但是:
尝试运行普通的$query = mysql_query()
和while($row = mysql_fetch_object($query))
。
答案 1 :(得分:1)
你说你的每一栏都有一个索引。你有索引吗?
alter table products add index (cat1, userrating)
如果你不这样做,试一试。运行该查询,让我知道它是否运行得更快。
另外,我假设您实际上在标题,字段上设置了某种过滤器而不是%
,对吗?
答案 2 :(得分:0)
我建议使用查询的列添加索引:title,imageURL和cat1。 第二个改进:使用SQL服务器缓存,它将致命地提高速度。 最后的改进:如果你的查询总是这样,只有值改变,那么使用预准备语句。
答案 3 :(得分:0)
好吧,我很确定%
作为LIKE
子句中的第一个字符,为您提供该列的全表扫描(在您的情况下,您将没有该完整的表扫描已执行,因为您已在AND
子句中具有限制子句。
除此之外,尝试在cat1
列上添加索引。另外,尝试在查询中添加其他标准,以减少数据集的大小 - 您的工作数据集(与查询匹配的行数,没有LIMIT
子句)也可能太大。