简化数据库/表结构我有一个情况,有两个表,我们存储“项目”和项目属性(两者之间的关系是 1-N)
我正在尝试优化以下查询,该查询获取热门交易部分中的最新商品。为此,我们有 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
谢谢
最佳答案
item_property.idOption 和 item_property.type 列的类型是什么? 如果它们包含有限数量的选项 - 将它们设为 ENUM(如果还没有)。枚举值会自动索引。 并且(当然)您还应该对 item_property.iditem 和 item.date_created 列建立索引。这将增加表的大小,但会大大加快按这些字段进行联接和排序的查询。
关于mysql - 优化 mysql Join 查询与日期排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16690102/