2022Java毕业设计项目全套,进来白嫖_哔哩哔哩_bilibili
前言
与数百个不同的客户打交道时,我经常在查询方面遇到类似的问题。 在尝试优化数据库环境时,一个非常常见的问题是索引使用。 无法使用索引的查询通常是长时间运行的查询,会消耗更多内存或触发更多磁盘 iops。
一个非常常见的情况是查询对涉及某种函数表达式的列使用过滤条件。无法使用该列上的索引。
从 MySQL 8.0.13 开始支持函数索引。在本文中,我将展示它们是什么以及它们是如何工作的。
众所周知的问题
如前所述,关于索引使用的一个非常常见的问题是,当您使用函数表达式作为过滤条件时。
让我们看一个简单的例子。
您有一个名为 products 的表,其中包含产品的详细信息,包括 create_time TIMESTAMP 列。如果您想计算产品在特定月份的平均价格,您可以执行以下操作:
mysql> SELECT AVG(price) FROM products WHERE MONTH(create_time)=10;
+------------+
| AVG(price) |
+------------+
| 202.982582 |
+------------+
查询返回正确的值,但请看一下 EXPLAIN:
mysql> EXPLAIN SELECT AVG(price) FROM products WHERE MONTH(create_time)=10\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: products
partitions: NULL
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 99015
filtered: 100.00
Extra: Using where
该查询触发对表的全表扫描。让我们在 create_time 上创建一个索引并再次检查:
mysql> ALTER TABLE products ADD INDEX(create_time);
Query OK, 0 rows affected (0.71 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> explain SELECT AVG(price) FROM products WHERE MONTH(create_time)=10\G
*************************** 1. row ***************************