mysql 使用SUM函数,如何建立索引

说实话,当我第一次接触函数索引时,我很困惑。
当时MySQL 5 .7 已经发布了虚拟列,我正在为客户构建ERP系统。
数据库表很多,字段密集。
突然有同事来找我说,呃,看看这个新功能,用函数索引可以省去很多麻烦。
我当时就有点疑惑,想知道这个虚拟列和索引有什么关系?
有趣的是,我后来还花时间查阅了官方文档。
原来MySQL 8 .0的内置功能索引是通过虚拟列来实现的。
例如,你可能会遇到这样的场景:有一个orders表,你需要计算折扣占订单金额的百分比,然后你需要快速查询折扣金额。
只需添加一个普通索引即可?这肯定行不通。
原来的amount字段存储在索引中,查询时需要重新计算。
这时候函数索引就派上用场了。
可以将计算出的折扣金额直接存储在索引中,查询时可以直接使用索引。

我尝试过使用表达式索引来优化电商后端的报表查询。
该表每天的增长量是巨大的。
在查询某个产品类别的平均评分时,使用传统的索引查询速度极慢。
切换到功能索引后,查询速度直接快了三个数量级。
但话虽如此,这个功能并不是一个伟大的壮举,它实际上会导致大量的存储空间。
例如,在一个项目中,同事添加了功能索引,发现存储空间增加了5 0%,最终不得不进行分区。
当数据量较少的时候你不会有太大的感觉,但是一旦数据量增加,效果就会相当明显。

这方面我没有亲自跑过InnoDB存储引擎源码,但是听说功能索引对事务的锁定机制也有一定的影响。
具体效果我没有深入研究过。
我记得从8 .0版本开始就支持该数据了,不过建议你检查一下。
这几天版本更新很快,所以我的记忆可能有点偏差。

mysql查看、创建和删除索引的方法

啊,是的,是的,我必须更具体地介绍一下 MySQL 索引。

我想看一张桌子。
它有哪些指标?这很简单。
输入命令行时,输入 SHOW INDEX FROM 后跟您的表名称,例如 SHOW INDEX FROM user。
看吧,我会打这个。
上车吧。
它会为你列出这个长列表,告诉你用户表,它有多少个索引,它叫什么,它是什么类型,它是用什么列创建的,还告诉你索引中每一列的顺序。
相当详细。
你看,Key_name是索引名,Seq_in_index是序号,Column_name是列名,Index_type是索引类型,比如BTREE或者HASH。
这非常重要。
它可能会帮助您了解,哦原来为什么某个查询快或慢是因为我添加了正确的索引。

如果我想添加索引该怎么办?索引也是一回事。
基本格式是这样的,CREATE索引名称INDEX,然后表名称ON。
例如,如果我想向用户表的电子邮件列添加索引,我可以键入 CREATE INDEX idx_email ON users (email)。
就是这么简单。

如果您特别担心并且不希望电子邮件列有重复的值,请使用 UNIQUE 关键字。
示例:在用户(电子邮件)上创建唯一索引 idx_unique_email。
你看,添加UNIQUE后,用户表中每个用户的email都会不同。
这是唯一的指标。

另外,如果你的列是TEXT类型并且特别长,比如description,并且你使用了大量的全文搜索,那么你需要全文索引。
MySQL 有专用的全文索引。
这并不像添加一个像UNIQUE这样的关键字那么简单。
它具有特定的语法,例如 CREATE FULLTEXT INDEX idx_ft_description ON user (description)。
您必须记住这一点,全文索引与常规索引不同。

哦,顺便说一下,还有一个前缀索引。
这是什么意思?对于像 VARCHAR 或 CHAR 这样很长的文本列,您懒得为其全文建立索引,并且您觉得使用整个列进行索引太大并且查询速度很慢。
然后您可以仅索引它的前几个字符。
例如,您可能只对用户名的前 1 0 个字符感兴趣。
该怎么办?在用户(用户名(1 0))上创建索引 idx_prefix_username。
你看,这里的 username(1 0) 意味着只有 username 列的前 1 0 个字符被索引。
这样索引会更小,创建和查询会更快。
你必须自己考虑这个前缀的长度,看看 1 0 个字符是否足够。

最后你看,索引名DROP INDEX ON 表名。
例如:DROP INDEX idx_email ON 用户。
如果您觉得该索引不再有用或添加不正确,您可能需要将其删除。
删除索引后,表可以变小,节省存储空间。
但!你一定要小心。
如果删除索引,查询可能会变慢,尤其是对于索引已被删除的列。
所以,在删除索引之前,一定要想清楚是否要删除是否删除以及删除影响是否大。

总之,添加或删除索引时必须小心。
尤其是在生产环境中,不要随意碰触。
最好先在测试环境中运行它,看看添加索引后查询是否变得更快,以及删除索引后查询是否变得异常慢。
要知道,有时候索引太多了。
当写入数据时,例如INSERT或UPDATE,数据库必须维护索引,这会减慢写入操作。
所以你必须找到一个平衡点。
不要只关注快速查询而忘记写作也很重要。
你要根据自己的业务场景来决定是增加列还是多写,然后决定给哪些列加索引,加什么类型的索引。
这个问题没有绝对的答案。
具体问题要具体分析。