Mysql过滤器根据以前选择的过滤器值进行匹配吗?

时间:2015-06-20 07:25:16

标签: mysql performance filter

我到处都看到这种过滤器,我知道Magento有相同的原理。

那么,这笔交易是什么。简单和解决方案是严格按值过滤并排除任何没有相同值的过滤器选项。我正在尝试做的事情,this web site和大量做的是按值过滤但允许在同一属性中选择多个值。所以关于maches(我知道如何通过选择的过滤器来过滤产品,这不是关于它,只是关于匹配)

大多数逻辑解决方案都是EAV,但是由于许多连接会使查询速度变得更慢,因此我会随着时间的推移将其称为“one-happy-table”,并且表结构为:

CREATE TABLE IF NOT EXISTS `filter` (
  `ProductID` int(10) unsigned NOT NULL,
  `AttributeID` int(10) unsigned NOT NULL,
  `ValueID` int(10) unsigned NOT NULL,
  UNIQUE KEY `ProductID_AttributeID_ValueID` (`ProductID`,`AttributeID`,`ValueID`),
  KEY `ProductID` (`ProductID`),
  KEY `ValueID` (`ValueID`),
  KEY `AttributeID` (`AttributeID`)
) ENGINE=MEMORY DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;

以下是我正在使用的查询。查询给出了我需要的结果,但速度很慢。

        SELECT  SQL_NO_CACHE 
        F.AttributeID,     
        F.ValueID,
        (SELECT COUNT(ProductID) 
        FROM filter AS FP
        WHERE F.ValueID = FP.ValueID
              AND (ProductID IN (SELECT ProductID
                                FROM   filter
                                WHERE
                                ValueID IN ( '33' ))
              OR AttributeID = (SELECT  AttributeID
                                FROM   filter
                                WHERE   ValueID IN ( '33' ) LIMIT 1))

         )  AS Items
        FROM filter AS F
        GROUP BY F.AttributeID,F.ValueID 

当Filter表有超过5000条记录时,它会越来越慢。 尝试了不同的索引,表存储引擎。当我添加大约5000个产品,并且每个产品都有例如7个过滤器值时,查询大约需要16秒。我做的最少查询时间是5.5秒,但我需要更快...

有没有人知道该怎么做才能让事情变得更快? 我想像here那样完成速度! :)

0 个答案:

没有答案