我有一个表结构如下:
CREATE TABLE `sale_product_inventories` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`sale_id` int(11) NOT NULL,
`product_id` int(11) NOT NULL,
`size` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
`tier_number` int(11) NOT NULL DEFAULT '1',
`sale_product_pool_id` int(11) DEFAULT NULL,
`inventory` int(11) NOT NULL,
`in_cart_units` int(11) DEFAULT '0',
`size_display_order` tinyint(4) NOT NULL DEFAULT '0',
`last_updated_by` int(11) DEFAULT '0',
`created_by` int(11) DEFAULT '0',
`status` enum('active','inactive') COLLATE utf8_unicode_ci NOT NULL DEFAULT 'active',
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `UNIQUE` (`sale_id`,`product_id`,`tier_number`,`size`,`sale_product_pool_id`)
) ENGINE=InnoDB AUTO_INCREMENT=92872 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
注意:我有一个索引 UNIQUE = sale_id
, product_id
, tier_number
, size
,sale_product_pool_id
当我运行此查询时:
select * from sale_product_inventories
where
sale_id in (502,504) and
(sale_id, product_id) in ((502,2),(502,1), (502,3),(502,4) ,(504,2) ,(504,3) )
MySql 使用索引 Unique 执行时间为 0.7 毫秒
但
当我运行这个查询时
select * from sale_product_inventories
where
(sale_id, product_id) in ((502,2),(502,1), (502,3),(502,4) ,(504,2) ,(504,3) )
MySql 没有使用 UNIQUE 索引,执行时间为 76 毫秒。
Mysql:5.5.27 InnoDB 版本:1.1.8
我的问题是为什么 mysql 以这种方式运行。有人可以帮我解决这个问题吗?
编辑:
我遇到了这个所以认为添加 MySQL 通常不能在列上使用索引可能是有用的,除非列在查询中被隔离。“隔离”该列意味着它不应该是表达式的一部分或在查询的函数内。