Mysql——SQL优化

下面主要讲一下常用的sql大局上的优化技巧,对于底层不做过多解释。

 

1.尽量走索引,如果可以的话,可以尝试联合索引,但是索引不易过多,因为这样mysql维护索引的成本会增加,写入,删除会变慢。

2.表的主键尽量是递增的整数,这样的话对于索引而言是有益的,索引文件会相对小,读取会相对快一点

3.利用冗余数据的方式,例如想要查看一个订单的下单用户名,那么t_order里面一般都会有user_id,那么再根据user_id去t_user表查user_name即可,但是这样就会多一次查询,因此可以考虑把user_name也存到t_order表当中,但是这样的话就会增加t_order表的存储空间(简单的以空间换时间的方式),这个问题还是不算什么,最主要的是一旦用户更改了用户名,那是不是就需要同步订单里的user_name喃?这个其实就可以根据实际业务去考虑了,更不更新都可以接受。

4.mysql是列式存储,因此建议表的字段不易过多,并且如果有不常用且文本过长的字段,那么建议通过外键(不是真正的外键哈)来实现,提高读取效率。

5.利用好mysql的limit 1这个方式,例如selectById那么找到一条就不会读了。

6.对于行锁的优化,尽量让行锁的持有时间最小化,那么我举例:买东西打账,只考虑单机

分为了以下的步骤

)1.给买家扣钱 update a set money = money - xx

)2.给卖家加钱 update a set money = money + xx

那么就是两条语句,但是顺序尤为重要,首先考虑顺序是 2 ,1

那么一个买家在未完成1之前,其他所有买家都会卡在2这个步骤上,那么大部分时间是都在阻塞,这是不合适的,

如果顺序是1,2的话,那么大家就都会各自完成自己的1,等一个买家完成2并提交之后,其他买家也能快速完成2,然后提交,这样极大程度减少了行锁的占有时间。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要查找占用磁盘资源比较高的 SQL,可以使用 MySQL 的性能分析工具——`pt-query-digest`,它可以分析 MySQL 的慢查询日志,生成报告并展示 SQL 查询的详细信息。 以下是使用 `pt-query-digest` 工具查找占用磁盘资源比较高的 SQL 的步骤: 1. 确保 MySQL 的慢查询日志已经开启,并记录了足够的历史记录。 2. 执行以下命令对慢查询日志进行分析: ``` pt-query-digest /var/lib/mysql/slow.log ``` 这里假设慢查询日志文件路径为 `/var/lib/mysql/slow.log`,你需要将其替换为实际的慢查询日志文件路径。 3. 分析报告会展示所有的 SQL 查询及其详细信息,你可以根据磁盘 IO 使用情况来找出占用磁盘资源比较高的 SQL,例如: ``` # Profile # Rank Query ID Response time Calls R/Call Apdx V/M Item # ==== ======== ================ ===== ====== ==== ===== ==================== # 1 0x 12.4513 14.2% 3470 0.0036 0.00 SELECT `id`, `name`, `email`, `status`, `created_at`, `updated_at` FROM `users` WHERE `status` = 1 ORDER BY `created_at` DESC LIMIT 10 # 2 0x 10.2039 11.7% 511 0.0200 0.00 SELECT `id`, `name`, `email`, `status`, `created_at`, `updated_at` FROM `users` WHERE `status` = 2 ORDER BY `created_at` DESC LIMIT 10 # 3 0x 9.3122 10.7% 14851 0.0006 0.00 SELECT `id`, `name`, `email`, `status`, `created_at`, `updated_at` FROM `users` WHERE `status` = 0 ORDER BY `created_at` DESC LIMIT 10 # 4 0x 6.3059 7.2% 12472 0.0005 0.00 SELECT COUNT(*) FROM `users` WHERE `status` = 0 # 5 0x 5.9732 6.8% 11501 0.0005 0.00 SELECT COUNT(*) FROM `users` WHERE `status` = 1 ``` 在这个例子,第一条 SQL 查询占用了 CPU 时间 14.2%,排名第一,可以考虑调整查询语句或者增加索引来优化性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值