我正在使用 MySQL 8.0.30,并且知道它支持功能索引。但是我尝试根据一些字段的总和创建一个索引,如下所示非常简单,但是没有使用索引,即使在可能的索引中,它也没有显示。
这是我的桌子
CREATE TABLE `sample_product` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`avai_qty` double DEFAULT NULL,
`picked_qty` double DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `functional_index` (((`avai_qty` + `picked_qty`)))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
这是我的查询
select * from sample_product where avai_qty + picked_qty > 5000;
我尝试运行解释
{
"query_block": {
"cost_info": {
"query_cost": "0.35"
},
"select_id": 1,
"table": {
"access_type": "ALL",
"attached_condition": "((`sample_product`.`avai_qty` + `sample_product`.`picked_qty`) > 5000)",
"cost_info": {
"data_read_per_join": "1K",
"eval_cost": "0.10",
"prefix_cost": "0.35",
"read_cost": "0.25"
},
"filtered": "100.00",
"rows_examined_per_scan": 1,
"rows_produced_per_join": 1,
"table_name": "sample_product",
"used_columns": [
"id",
"name",
"avai_qty",
"picked_qty"
]
}
}
}
我不确定这是 MySQL 的错误还是我做错了什么。
当表几乎为空时MySQL不会使用索引。
当条件中使用表达式时,MySQL 无法使用表达式索引,即使索引中的表达式和条件中的表达式字面匹配。
可能的解决方案:使用所需的表达式创建虚拟生成列,按此列创建索引,在条件中使用此列而不是表达式。使该列不可见 - 如果不这样做,则列列表关键的查询(例如,
INSERT INTO table SELECT ..
)将在创建新列后失败。小提琴
最后,我将 2 个数字列的类型更改为 bigint 而不是 double,并再次尝试该查询,它按预期工作。