0

简化数据库/表结构我有两个表的情况,我们存储“项目”和项目属性(两者之间的关系是 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

哪个是优化此查询的最佳索引?现在优化器(解释)将使用临时和文件排序,处理一吨行(连接的大小)

表目前都是 MyIsam,但如果确实需要优化查询,可以更改为 InnoDB

谢谢

4

2 回答 2

1

A note about data correctness:

One of the big benefits of a NOT NULL is to prevent your program from creating a row that doesn't have all columns properly specified. Having a DEFAULT renders that useless.

Is it ever OK to have a blank proptype or propvalue? What does a blank in those fields mean? If it's OK to not have a proptype set, then remove the NOT NULL constraint. If you must always have a proptype set, then having DEFAULT '' will not save you from the case of inserting into the row but forgetting to set proptype.

In most cases, you want either NOT NULL or DEFAULT 'something' on your columns, but not both.

于 2013-05-22T16:45:20.103 回答
1

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

于 2013-05-22T11:15:18.293 回答