Mysql-性能优化-常见优化手段

索引优化

  1. 表记录很少不需创建索引 :索引是要有存储的开销
  2. 一个表的索引个数不能过多:
    (1)空间:浪费空间。每个索引都是一个索引树,占据大量的磁盘空间。
    (2)时间:更新(插入/Delete/Update)变慢。需要更新所有的索引树。太多的索引也会增加优化器的选择时间。所以索引虽然能够提高查询效率,索引并不是越多越好,应该只为需要的列创建索引。
  3. 频繁更新的字段不建议作为索引:频繁更新的字段引发频繁的页分裂和页合并,性能消耗比较高。
  4. 区分度低的字段,不建议建索引:
    比如性别,男,女;比如状态。区分度太低时,会导致扫描行数过多,再加上回表查询的消耗。
    如果使用索引,比全表扫描的性能还要差。这些字段一般会用在组合索引中。姓名,手机号就非常适合建索引。
  5. 在InnoDB存储引擎中,主键索引建议使用自增的长整型,避免使用很长的字段:
  6. 主键索引树一个页节点是16K,主键字段越长,一个页可存储的数据量就会越少,比较臃肿,查询
    时尤其是区间查询时磁盘IO次数会增多。辅助索引树上叶子节点存储的数据是主键值,主键值越
    长,一个页可存储的数据量就会越少,查询时磁盘IO次数会增多,查询效率会降低。
  7. 不建议用无序的值作为索引:例如身份证、UUID。更新数据时会发生频繁的页分裂,页内数据不
    紧凑,浪费磁盘空间。
  8. 尽量创建组合索引,而不是单列索引:
    优点:
    (1)1个组合索引等同于多个索引效果,节省空间。
    (2)可以使用覆盖索引
    创建原则:组合索引应该把频繁用到的列、区分度高的值放在前面。频繁使用代表索引的利用率
    高,区分度高代表筛选粒度大,这样做可最大限度利用索引价值,缩小筛选范围

在我们建立索引的时候尽量满足这些原则

LIMIT优化

1 如果我们已知查询的数据是唯一的,最好在查询的最后就加LIMIT 1,这样可以避免全表扫描。

select userName from user where userName = 'liyong';
#这样就可以避免全表扫描
select userName from user where userName = 'liyong' limit 1;

limit 在分页的时候如果出现深度分页需要加载数据然后进行分页,这样会产生大量的磁盘IO,很容易出现慢SQL,这个问题可以通过产品层面去限制深度分页
我们可以记录上次的偏移量,然后根据所以去查询数据,最后做一个过滤。

select * from (select * from tuser2 where id > 1000000 and id < 1000500 ORDER BY id) t limit 0, 20

子查询优化

使用子查询进行SELECT语句嵌套查询,可以一次完成很多逻辑上需要多个步骤才能完成的SQL操作。子查询虽然很灵活,但是执行效率并不高。

select goods_id,goods_name from goods where goods_id = (select max(goods_id)
from goods);

执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以子查询的速度会受到一定的影响。这多了一个创建临时表和销毁表的过程.
优化方式:可以使用连接查询(JOIN)代替子查询,连接查询时不需要建立临时表,其速度比子查询快。

其它优化手段

小表驱动大表 :建议使用left join时,以小表关联大表,因为使用join的话,第一张表是必须全扫描的,以少关联多就可以减少这个扫描次数。

连接操作加索引 :JOIN两张表的关联字段最好都建立索引,而且最好字段类型一致。

where条件 WHERE条件中尽量不要使用not in语句,建议使用not exists。

优化工具 利用慢查询日志、explain执行计划查询、show profile查看SQL执行时的资源使用情况

SQL语句性能分析

Query Profiler是MySQL自带的一种Query诊断分析工具,通过它可以分析出一条SQL语句的硬件性能瓶颈在什么地方。

show variables like '%profil%';
set profiling=1;

使用语法:

SHOW PROFILE [type,type] [FOR QUERY n] [LIMIT row_count [OFFSET offset]]

show profile 和 show profiles 语句可以展示当前会话(退出session后,profiling重置为0) 中执行语句的资源使用情况.
show profiles :以列表形式显示最近发送到服务器上执行的语句的资源使用情况,显示的记录数由变量:profiling_history_size 控制,默认15条
在这里插入图片描述

show profile: 展示最近一条语句执行的详细资源占用信息,默认显示 Status和Duration两列
show profile 还可根据 show profiles 列表中的 Query_ID ,选择显示某条记录的性能分析信息

-- 查看某条SQL的性能分析信息
show profile for query 1;
-- 查看某条SQL的具体某个指标的性能分析
show profile for query 220;

在这里插入图片描述

type是可选的,取值范围可以如下:

  • ALL 显示所有性能信息
  • BLOCK IO 显示块IO操作的次数
  • CONTEXT SWITCHES 显示上下文切换次数,不管是主动还是被动
  • CPU 显示用户CPU时间、系统CPU时间
  • IPC 显示发送和接收的消息数量
  • MEMORY [暂未实现]
  • PAGE FAULTS 显示页错误数量
  • SOURCE 显示源码中的函数名称与位置
  • SWAPS 显示SWAP的次数

查看指定资源类型

show profile cpu for query 2;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值