首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用日期排序优化mysql连接查询

使用日期排序优化mysql连接查询
EN

Stack Overflow用户
提问于 2013-05-22 19:03:23
回答 2查看 104关注 0票数 0

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

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

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

下面是两个表的结构:

代码语言:javascript
复制
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;

下面是查询:

代码语言:javascript
复制
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)将使用temporary和filesort,处理大量的行(连接的大小)

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

谢谢

EN

回答 2

Stack Overflow用户

发布于 2013-05-22 19:15:18

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

票数 1
EN

Stack Overflow用户

发布于 2013-05-23 00:45:20

关于数据正确性的注意事项:

NOT NULL的最大好处之一是防止程序创建没有正确指定所有列的行。有一个缺省值会让它变得无用。

有一个空白的proptypepropvalue是可以的吗?这些字段中的空格是什么意思?如果不设置proptype是可以的,那么删除NOT NULL约束。如果必须始终设置proptype,那么使用DEFAULT ''将不会使您避免插入到行中但忘记设置proptype的情况。

在大多数情况下,您希望在列上使用NOT NULLDEFAULT 'something'之一,但不能同时使用两者。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16690102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档