模拟函数索引

Exisi 2023-04-11 13:14:30
Categories: Tags:
  • 函数索引的实现依靠一个隐藏的虚拟生成列。通过显式创建虚拟生成列和索引,可以在 MySQL 8.0.13 之前的版本上实现相同的功能。

 

  • 我们可以利用 MySQL 5.7 中的虚拟字段的功能来对

 

  1. 首先创建生成虚拟列

示例

ALTER TABLE products

ADD COLUMN create_month TINYINT GENERATED ALWAYS AS ( MONTH(create_time) ) VIRTUAL;

 

运行结果如下:

Query OK, 0 rows affected (0.04 sec)

 

  1. 然后在虚拟列上创建索引

示例

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

 

  1. 使用函数表达式套用模拟生成列的索引

示例

SELECT id FROM products

WHERE MONTH(create_time)=10;

 

运行结果如下

+--------------+

| id                |

+--------------+

| 1                 |

+--------------+

| 4                 |

+--------------+

 

  • 上述语句中 MONTH(create_time) 被显示的识别为`create_month`列的别名,因此索引可以生效

 

 

来自 < https://zhuanlan.zhihu.com/p/436796705>