Mysql使用中的性能优化——索引对插入操作的性能影响

嘿,我最近一直在想这个问题,我想告诉你实话。

假设上周发布。
他的系统中的数据量突然增加到了数百万,然后他开始抱怨数据插入非常慢。
1 . 看了一下,原来索引是作者的错。

想一想,每次插入数据时,MySQL都必须更新那些索引,无论是B+树还是其他结构。
仔细想想,光是这一步就麻烦了。
特别是,索引字段越多,维护成本就越高。
例如,对于客户本人来说,他的表中列出了几个字段,并且每次都必须插入这些树。
当树被控制时,它会变慢。

单一索引比较棘手,因为必须首先检查价格是否重复。
想想看,有几千万本书的数据,这个问题可能要花很多时间。
我之前实验过,在插入1 000万条左右的数据时,通常有索引的数据会和没有索引的数据一样慢。
有了这个数据量,差异可以是1 .5 倍。
但如果你只有 1 00 万,可能会慢 2 0% 左右。

最搞笑的是,随着信息量的增加,这个差距会越来越大。
我画了一张图,有三行:无索引、普通索引、唯一索引。
您会发现没有索引的行最浅,有唯一索引的行最深。
为什么?因为当数据量很大时,一个索引的重复检查操作会变得越来越耗时。
例如,给定 5 000 万个币,差距可能会超过 5 0%。

普通索引和唯一索引没有太大区别。
最重要的是,各个索引都逐步添加了双重检查。
综合指数则更加令人困惑。
你想一想,如果索引包含的字段较多,那么插入时要保存那么多结构,肯定会比较慢。
我测得复合索引比单字段索引慢 1 .2 到 1 .5 倍。

该怎么办?
1 .观察邮件系统写入:如果你的系统整天都在写入,比如日志,我建议你少添加列表,或者使用列表更新延迟操作。
如果搜索系统主要类似于帖子,那么您将不得不接受较慢的查询以换取更快的查询。
2 .选择正确的索引:不要为所有字段添加索引,只添加经常检查的字段。
最好使用索引屏幕,这意味着索引包含查找内容所需的所有字段,因此您不必返回表来查找数据,并且搜索肯定会更快。
3 、批量插入:单次插入肯定慢。
如果您使用 LOADED DATA INFILE 或一次插入多个对象(输入 insert...VALUES(...)(...)),它肯定会比一次插入一个更快。
在某些情况下,甚至先禁用索引,然后再进行批量插入(此方法必须谨慎使用,这取决于站点,尤其是MyISAM机器)。
4 、监控和删除:列表越多越好。
必须使用SHOW INDEX来查看哪个索引没用,如果没用就删除它。
使用 EXPLAIN 分析您的 SQL 并查看它是否是有用的索引。

尽管如此,该索引是一把利剑,并且存在维护成本。
您可以根据自己的业务需求,评估插入和查询哪个更重要,然后决定是否添加列表以及添加哪个列表。
有时您必须接受较慢的条目以换取更快的查询。

深分页怎么导致索引失效了?提供6种优化的方案!

稍等一下,昨天我在调试电商后端分页接口的时候,限制是1 0000。
我在慢查询日志中发现了像 2 0 这样的语句,这使得数据库非常慢。
用户每次翻页,服务器都要找到前1 002 0条数据,丢弃前1 0000条,最后给用户2 0条。
想想如果表有数百万个数据段。
应该扫描磁盘多少次?所有的标签都是徒劳的。

我直接改了SQL,添加了有效索引idx_category_price(category_id,price,id)。
新请求将选择category_id=2 3 ,价格在1 00到2 00之间,限制2 0到1 0000。
这次,执行计划直接使用索引扫描,不返回表。
更改后,观察结果显示 QPS 增加了一倍。
然而,我发现了一些奇怪的事情。
当偏移量超过5 0000时;查询时间突然变慢了...
突然想到旧系统中用于分页优化的“最后查询最大ID”方法。
保存一个变量记录上一次查询的最后一个ID,下次直接检查where id > last_id 约束2 0。
这种方法特别适合ID单调递增的情况。
但现在现在很多新业务需要前后端分离。
数据库连接池中的每个用户都可以有自己单独的计数器,需要一个缓存来存储这些偏移量...
在六个解决方案中,我最推荐第二个和第三个。
虽然覆盖标签简单明了;仅当企业接受时,某些列的验证才可用。
光标分页更加灵活,但是客户端必须管理好这些偏移量;否则,打开更多选项卡会让用户感到困惑。
我最近尝试优化联接表查询,并将产品的内联接类别放在子句 where products.category_id=categories.id 中。
因此,MySQL 将此作为连接条件进行了优化,并节省了大量排序。
不过这个功能只有5 .7 版本才稳定,而且升级旧系统的成本有点高...
等一下,刚刚看Redis页面实现代码,发现他们使用set命令zrevrangecategory_id 1 0000 1 01 1 9 进行排序。
这个功能肯定是比较好,但是电商系统的数据量是巨大的。
将所有数据直接放入Redis需要考虑内存消除策略......

MySQL 笔记 - 索引优化

那天我正在调试一个电商订单系统,用户抱怨查询某段时间的订单极其缓慢。
我直接使用Explain来读取SQL语句。
类型齐全,我很震惊。
表只有几十万条,如何扫描全表? 原来WHERE条件使用了两个未索引的日期字段进行比较。
快速添加复合索引,类型立即变为范围,时间快了三个数量级。
等等,还有一件事。
我注意到 Extra 说使用临时表。
原来是为了排序创建了一个临时表。
索引顺序调整为最常用的字段放在前面,排序效率提升了不少。
我突然想到他们的系统每天都会运行数百个这样的查询,索引维护的成本其实并不高。
现在看这些优化细节,比如前缀索引、避免%LIKE前缀等,确实需要结合业务场景。
例如,当用户搜索产品时,品牌词可能会很长,因此使用前缀索引可以省去麻烦。
但对于库存这样的字段,前缀选择性太差,全列索引还是可靠的。
MySQL文档说索引下推可以加速联合查询。
看来我们系统的InnoDB引擎用得不多,需要再试一次。