2012-04-10 98 views
1

我运行以下查询,但我改变它,它仍然需要近5秒的运行,这是完全不能接受的......MySQL表或查询优化

查询:

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万行。

+0

你能告诉我们表格模式 – amd 2012-04-10 06:52:26

+0

3 mil行表和索引在几乎每一列..这只是不好。 – 2012-04-10 07:06:39

回答

1

你说你在每一列都有索引。你有像这样的索引吗?

alter table products add index (cat1, userrating) 

如果你不这样做,试试看。运行该查询并让我知道它是否运行得更快。

此外,我假设你实际上设置某种过滤器而不是标题,字段上的%

+1

它仍然不是辉煌的,但削减时间超过了一半 - 感谢! – 2012-04-10 11:23:15

1

您应该将cat1作为一个整数,然后将这三百万行中的一个字符串。您还必须正确编制索引。如果索引所有列只有改进,那么这将是系统将会执行的默认操作。

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

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

0

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

0

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