简化数据库/表结构我有两个表的情况,我们存储'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
由于
答案 0 :(得分:1)
item_property.idOption和item_property.type列的类型是什么? 如果它们包含有限数量的选项 - 将它们设为ENUM(如果它们尚未存在)。枚举值会自动编入索引。 并且(当然)您还应该将index_property.iditem和item.date_created列编入索引。这将增加表的大小,但会大大加快按这些字段加入和排序的查询。
答案 1 :(得分:1)
关于数据正确性的说明:
NOT NULL的一大好处是防止程序创建没有正确指定所有列的行。拥有DEFAULT会导致无效。
空白proptype
或propvalue
是否可以?这些字段中的空白是什么意思?如果没有设置proptype
即可,则删除NOT NULL
约束。如果您必须始终设置proptype
,那么DEFAULT ''
将无法避免您插入行而忘记设置proptype
。
在大多数情况下,您希望列上的NOT NULL
或DEFAULT 'something'
,而不是两者。