mysql - 优化 mysql Join 查询与日期排序

标签 mysql sql query-optimization

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

相关文章:

php - 真正简单的 PHP/PDO 插入不起作用?

mysql - 评分作业 [Zaption] 数据库

php - 按照他们发送或接收的最新消息的顺序选择人员

c# - 结果类型 'System.Tuple` 3[System.Guid,System.Int32,System.String]' 可能不是抽象的,必须包含默认构造函数

sql - 即使有索引,对数百万条记录的 SUM 查询也很慢,我该如何优化?

两列之间的Mysql datetime

mysql - 将数据从一个mysql表复制到同一数据库的另一个mysql表

sql - LINQ区分大小写

database - 查询冗余和优化的地方

mysql - SQL schema优化,如何避免union?