- 函数索引的实现依靠一个隐藏的虚拟生成列。通过显式创建虚拟生成列和索引,可以在 MySQL 8.0.13 之前的版本上实现相同的功能。
- 我们可以利用 MySQL 5.7 中的虚拟字段的功能来对
- 首先创建生成虚拟列
示例
ALTER TABLE products
ADD COLUMN create_month TINYINT GENERATED ALWAYS AS ( MONTH(create_time) ) VIRTUAL;
运行结果如下:
Query OK, 0 rows affected (0.04 sec)
- 然后在虚拟列上创建索引
示例
ALTER TABLE products ADD INDEX(create_month);
SHOW CREATE TABLE products
运行结果如下:
*************************** 1. row ***************************
Table: products
Create Table: CREATE TABLE `products` (
`id` int NOT NULL AUTO_INCREMENT,
`create_time` timestamp NULL DEFAULT NULL,
`create_month` tinyint GENERATED ALWAYS AS (month(`create_time`)) VIRTUAL,
PRIMARY KEY (`id`),
KEY `create_month` (`create_month`)
) ENGINE=InnoDB AUTO_INCREMENT=149960 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
- 使用函数表达式套用模拟生成列的索引
示例
SELECT id FROM products
WHERE MONTH(create_time)=10;
运行结果如下
+--------------+
| id |
+--------------+
| 1 |
+--------------+
| 4 |
+--------------+
- 上述语句中 MONTH(create_time) 被显示的识别为`create_month`列的别名,因此索引可以生效