使用日期排序优化mysql Join查询

时间:2013-05-22 11:03:23

标签: mysql sql query-optimization

简化数据库/表结构我有两个表的情况,我们存储'items'和item属性(两者之间的关系是1-N)

我正在尝试优化以下查询,该查询获取hotdeals部分中的最新项目。为此,我们有item_property表,用于存储项目部分以及许多其他项目元数据

注意:无法更改表结构以优化查询,即:我们不能简单地将该部分添加为item表中的列,因为我们可以为每个项目提供无限数量的部分。

这是两个表格的结构:

CREATE TABLE `item` (
  `iditem` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `itemname` varchar(200) NOT NULL,
  `desc` text NOT NULL,
  `ok` int(11) NOT NULL DEFAULT '10',
  `date_created` datetime NOT NULL,
  PRIMARY KEY (`iditem`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE `item_property` (
  `iditem` int(11) unsigned NOT NULL,
  `proptype` varchar(64) NOT NULL DEFAULT '',
  `propvalue` varchar(200) NOT NULL DEFAULT '',
  KEY `iditem` (`iditem`,`proptype`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

这是查询:

SELECT *
FROM item 
JOIN item_property ON item.iditem=item_property.iditem 
WHERE 
    item.ok > 70 
    AND item_property.proptype='section'
    AND item_property.propvalue = 'hotdeals' 

ORDER BY item.date_created desc
LIMIT 20

哪个是优化此查询的最佳索引? 现在优化器(Explain)将使用临时和filesort,处理一行Ton(连接的大小)

表格目前都是MyIsam,但如果真的有必要优化查询,可以更改为InnoDB

由于

2 个答案:

答案 0 :(得分:1)

item_property.idOption和item_property.type列的类型是什么? 如果它们包含有限数量的选项 - 将它们设为ENUM(如果它们尚未存在)。枚举值会自动编入索引。 并且(当然)您还应该将index_property.iditem和item.date_created列编入索引。这将增加表的大小,但会大大加快按这些字段加入和排序的查询。

答案 1 :(得分:1)

关于数据正确性的说明:

NOT NULL的一大好处是防止程序创建没有正确指定所有列的行。拥有DEFAULT会导致无效。

空白proptypepropvalue是否可以?这些字段中的空白是什么意思?如果没有设置proptype即可,则删除NOT NULL约束。如果您必须始终设置proptype,那么DEFAULT ''将无法避免您插入行而忘记设置proptype

在大多数情况下,您希望列上的NOT NULLDEFAULT 'something',而不是两者。