1

以下查询在订购时需要 10 秒才能完成。如果没有命令,它会在 0.0005 秒内完成。我已经在字段“sku”、“vid”和“timestamp”上有一个索引。我在这张表中有更多的 200,000 条记录。请帮忙,使用order by时查询有什么问题。

SELECT i.pn,i.sku,i.title, fl.f_inserted,fl.f_special, fl.f_notinserted
FROM inventory i 
LEFT JOIN inventory_flags fl ON fl.sku = i.sku AND fl.vid = i.vid
WHERE i.qty >=2 ORDER BY i.timestamp  LIMIT 0,100;

-- --------------------------------------------------------

--
-- Table structure for table `inventory`
--

CREATE TABLE IF NOT EXISTS `inventory` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `pn` varchar(60) DEFAULT NULL,
  `sku` varchar(60) DEFAULT NULL,
  `title` varchar(60) DEFAULT NULL,
  `qty` int(11) DEFAULT NULL,
  `vid` int(11) DEFAULT NULL,
  `timestamp` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `vid` (`vid`),
  KEY `sku` (`sku`),
  KEY `timestamp` (`timestamp`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

--
-- Table structure for table `inventory_flags`
--

CREATE TABLE IF NOT EXISTS `inventory_flags` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `f_inserted` tinyint(1) DEFAULT NULL,
  `f_notinserted` tinyint(1) DEFAULT NULL,
  `f_special` tinyint(1) DEFAULT NULL,
  `timestamp` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `sku` varchar(60) DEFAULT NULL,
  `vid` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `vid` (`vid`),
  KEY `sku` (`sku`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

解释结果:

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE  fl  system  vid,sku NULL    NULL    NULL    0   const row not found
1   SIMPLE  i   index   NULL    timestamp   5   NULL    10  Using where
4

3 回答 3

4

您需要在表上放置列索引,而不是在列上添加单独的索引,因为您在连接条件下使用来自同一个表的多个列。

在包括来自WHERE子句的列之后,还包括在复合索引ORDER BY中的子句中使用的列。尝试添加流动索引并使用EXPLAIN测试它们:

ALTER TABLE ADD INDEX ix_if inventory_flags(sku, vid);
ALTER TABLE ADD INDEX ix_i inventory(sku, qty, timestamp);

还要尽量避免DISTINCT查询中的子句,它相当于GROUP BY子句,如果你仍然需要它,那么考虑添加覆盖索引。

于 2012-08-21T10:17:11.413 回答
2

如果sku每个库存项目都是唯一的,则将其定义为UNIQUE- 它会加快速度。(或者skuvid- 在这种情况下定义一个复合索引的组合。)

你为什么要这样做SELECT DISTINCT?绝大多数时间使用DISTINCT是您的查询或表结构错误的标志。

因为它是DISTINCT,sku不是UNIQUE它不能使用时间戳上的索引来加快速度,所以它必须对一个有 200,000 条记录的表进行排序 - 它甚至不能使用 qty 上的索引来加速该部分。

PS。Omesh 也有一些很好的建议。

于 2012-08-21T10:17:59.703 回答
0

你可以使用force index(index_key). 试试看,你会在解释查询中看到mysql现在将在'order by'时使用键索引

于 2014-07-17T08:04:18.020 回答