用这个表不能实现覆盖指数(2个等值和一个选择)?

gre*_*emo 9 mysql sql indexing optimization

CREATE TABLE `discount_base` (
  `id` varchar(12) COLLATE utf8_unicode_ci NOT NULL,
  `amount` decimal(13,4) NOT NULL,
  `description` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `family` varchar(4) COLLATE utf8_unicode_ci NOT NULL,
  `customer_id` varchar(8) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`),
  KEY `IDX_CUSTOMER` (`customer_id`),
  KEY `IDX_FAMILY_CUSTOMER_AMOUNT` (`family`,`customer_id`,`amount`),
  CONSTRAINT `FK_CUSTOMER` FOREIGN KEY (`customer_id`) 
      REFERENCES `customer` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Run Code Online (Sandbox Code Playgroud)

我添加了一个覆盖指数IDX_FAMILY_CUSTOMER_AMOUNTfamily,customer_id而且amount因为大部分时间我用下面的查询:

SELECT amount FROM discount_base WHERE family = :family AND customer_id = :customer_id
Run Code Online (Sandbox Code Playgroud)

然而,使用EXPLAIN和弹回记录(~250000)它说:

'1', 'SIMPLE', 'discount_base', 'ref', 'IDX_CUSTOMER,IDX_FAMILY_CUSTOMER_AMOUNT', 'IDX_FAMILY_CUSTOMER_AMOUNT', '40', 'const,const', '1', 'Using where; Using index'
Run Code Online (Sandbox Code Playgroud)

为什么我要在哪里使用; 使用索引而不仅仅使用索引

编辑:摆弄少量数据(使用where;使用索引):

EXPLAIN SELECT amount
FROM discount_base
WHERE family = '0603' and customer_id = '20000275';
Run Code Online (Sandbox Code Playgroud)

另一个小提琴其中idfamily+ customer_id(常量):

EXPLAIN SELECT amount
FROM discount_base
WHERE `id` = '060320000275';
Run Code Online (Sandbox Code Playgroud)

Jua*_*uan 1

family 和 customer_id 是字符串吗?我猜您可能会将 customer_id 作为整数传递,这可能会导致发生类型转换,因此索引不会用于该特定列。

确保将 customer_id 作为字符串传递,或考虑更改表以将 cusomer_id 存储为 INT。

如果您使用字母数字 ID,则这不适用。