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_AMOUNT上family,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)
另一个小提琴其中id是family+ customer_id(常量):
EXPLAIN SELECT amount
FROM discount_base
WHERE `id` = '060320000275';
Run Code Online (Sandbox Code Playgroud)
family 和 customer_id 是字符串吗?我猜您可能会将 customer_id 作为整数传递,这可能会导致发生类型转换,因此索引不会用于该特定列。
确保将 customer_id 作为字符串传递,或考虑更改表以将 cusomer_id 存储为 INT。
如果您使用字母数字 ID,则这不适用。