mysql语句优化

文章介绍了SQL优化的各种策略,包括批量插入以减少数据库链接,使用主键顺序插入提高效率,利用LOAD指令进行大数据插入,以及优化orderby、groupby、limit和count操作。强调了主键设计原则,如减少主键长度和使用顺序值,并提示了update操作中应避免全表扫描以防止锁表问题。
摘要由CSDN通过智能技术生成

Sql优化

插入数据

1, 我们在进行插入操作时, 尽量使用批量插入的操作, 因为这样我们可以减少数据库的链接, 插入的速度会更快
2, 手动事务提交, 即假设我们是批量执行单条插入语句时, 手动开启事务, 减少事务的提交
3, 使用主键顺序插入, 顺序插入的效率要比乱序插入的效率更高, 这是因为我们在表数据的聚集索引结构中, 叶子节点形成一个顺序的链表结构, 若乱序插入, 那我们插入时就需要在链表中的某段插入, 这将导致表节点的改变, 同时也会造成页分裂的情况, 增加插入的时间

大数据插入操作优化

大数据量的插入时, 我们可以使用mysql的load指令, 具体可以自行百度, 假设300w数据插入, 使用批量插入的时间需要10多分钟, 而通过load指令直接读取本地数据的速度只需要10多秒, 速度提升很大0

主键优化

主键设计的原则如下
1,尽量减少主键的长度, 比如像uuid, 身份证号这种自然唯一的值并不适合作为主键, 这是因为主键的长度越长, 那占的空间就越大, 我们在创建二级索引时所叶子节点存放的是id值, 那id值越大, 意味着我们二级索引所占据的空间就越大
2, 尽量使用顺序值作为主键, 如自增主键, 这里的原因也就是上文所说到的主键顺序插入的问题
3, 在业务中尽量不要去修改主键, 因为这将导致表的索引结构(包括聚集索引和二级索引)发生改变, 需要耗费比较高的时间

order by优化

mysql的排序方式分两种
1, using filesort(通过表的索引, 或全表扫描得出数据行后在缓冲区进行排序)
2. using index(直接通过表的索引, 就可以得出排序, 不需要在缓冲区再进行排序)
而我们要做的就是在order by的时候, 尽量达到using index的情况, 在这里也有可能会出现 backward index scan的情况, 这种情况代表了反向扫描索引
而order by 的建议如下
1, 对需要order by的字段建立索引, 但需要注意, 在联合索引时, 索引失效的问题, 因为在order by中, 索引同样遵循最左法则, 若创建索引时的字段顺序与排序时的字段顺序不同, 同样会出现using filesort的情况(比如建立a_b联合索引, 多字段排序时写法为 order by b,a)
2, 尽量使用覆盖索引, 这样可以让我们达到using index的排序方式, 速度最佳
3, 注意索引结构中叶子节点的排序方式, 假设按默认的建立索引, 那索引叶子节点中存放的顺序将是升序, 若此时我们对数据进行倒序排序, 这时就会出现 backward index scan的情况, 会降低性能, 在mysql8的版本中, 支持在建立索引时指定索引的排序方式
4, 若不可避免出现filesort的情况时, 大数据量排序我们可以适当增加排序缓冲区的大小(具体怎么增加请百度)

group by优化

建议
1, group by也是可以使用索引对其进行优化的
2, 联合索引时也需要注意最左法则, 比如一个索引a_b, 对a,b字段创建联合索引, 那如果我们只使用b字段进行排序, 也会导致索引失效的问题

limit优化

limit的优化官方推荐使用覆盖索引+子查询的方式, 这是因为如果我们在大数据量数据进行limit时, 查询的速度会根据偏移量的增加而增加, 而覆盖索引+子查询的方式即先通过索引查询出指定的id, 再通过联表或在业务中用in查询的方式去查询指定的分页数据

count优化

count的优化其实并没有什么好的解决办法, 如果大数据量非要优化, 可以通过缓存在插入或删除数据时记录数量, 那这样就能很快的取出总数

count的用法

count各个用法的速度对比如下
count(*) > count(1) > count(id) > count(字段值)
各用法含义, 肉眼可见为何如此的对比结果

update优化

update的优化主要是需要注意锁表的情况出现
innodb引擎虽说特点是锁行, 但锁行是针对索引去锁的, 若是update时并未用到索引, 这将导致mysql对该数据表进行锁表, 那在别的事务中就无法再对该表进行数据的更改, 更容易出现死锁的问题, 大大降低并发性能, 所以我们update的条件中最好带上索引字段, 触发行锁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
对于MySQL语句优化,以下是一些建议: 1. 确保正确的索引:创建适当的索引可以显著提高查询性能。根据查询的特点和表的结构,选择合适的索引列和索引类型。 2. 优化查询语句:使用正确的查询语句可以减少数据库的负担。避免使用SELECT *,只选择需要的列。合理使用JOIN,避免多次嵌套子查询。 3. 避免全表扫描:全表扫描会导致性能下降。通过合理使用索引、优化查询语句和分页等方式,尽量避免全表扫描。 4. 使用EXPLAIN分析查询计划:通过使用EXPLAIN命令分析查询计划,可以了解MySQL是如何执行查询的,从而找到潜在的性能问题。 5. 合理配置服务器参数:根据服务器的硬件资源和实际负载情况,合理配置MySQL的参数,如缓冲区大小、连接数等。 6. 避免过度使用触发器和存储过程:触发器和存储过程会增加数据库的负担,应谨慎使用,并定期检查其性能影响。 7. 定期优化表结构:根据实际需求和数据变化情况,定期检查和优化表结构,包括字段类型、表关系等。 8. 合理使用缓存:使用缓存可以减少数据库访问次数,提高性能。根据业务需求,合理选择缓存策略和工具。 9. 定期维护和优化数据库:定期进行数据库维护工作,如备份、索引重建、碎片整理等,保持数据库的健康状态。 请注意,以上建议仅供参考,具体优化策略需要根据实际情况进行分析和调整。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值