MySQL性能优化分析——第三课

DBC 1.7K 0

一、基于Durid分析Mysql执行性能

配置Durid打开SQL执行监控

点击查看完整内容

打开网站,就可以来到Druid界面

http://localhost:8080/druid/index.html
MySQL性能优化分析——第三课插图

多的不谈,直接安排代码

熟悉的mapper和xml编写

CustomUserMapper.java

点击查看完整内容

CustomUserMapper.xml

点击查看完整内容

UserController

点击查看完整内容
温馨提示

这里值得注意的是Lists.partition(userList, 200); 以下说明来自网络中收集。

Java之Lists.Partition使用与坑

点击查看完整内容

温馨提示

具体应该是这样分段会使性能提高一些,所以用这种方式!

二、Mysql数据库索引性能分析实战

在数据量1000w的表里面对比是否采用索引数据对照组,查询使用索引前面性能对比

使用索引前的执行情况

MySQL性能优化分析——第三课插图2
使用索引后的执行情况

MySQL性能优化分析——第三课插图4

温馨提示

我们可以看到,加入了索引之后,查找速度快了许多,为什么还是没有肉眼可见的快呢,当你的mysql数据容量超过千万,那么查询时间就有可能为好几秒,你加入了索引之后可能就为0.1秒以内,这就是肉眼可见的快了!

  • 不适合用索引的场景
    • 不适合键值较少的列(重复数据较多的列)
    • 索引无法存储null值
  • 索引失效的经典场景
    • 如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因),要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引
    • 对于多列索引,不是使用的第一部分,则不会使用索引
    • like查询以%开头
    • 类型强转情况下不走索引,如varchar类型用long传参来查
    • hash索引不支持范围检索

三、高级面试题之谈谈你对MYSQL优化的理解

谈谈你对SQL优化的理解

  • SQL优化可分为两个部分,一个是设计阶段,另一个是查询阶段
  • 设计阶段运用到的优化
    • 使用适当的数据库列类型和大小
    • 尽量从设计上采用单表查询解决业务问题
    • 在适当字段加入索引,能用唯一索引用唯一索引
  • 查询阶段涉及的优化
    • 尽可能不用select *:让优化器无法完成索引覆盖扫描这类优化,而且还会增加额外的I/O、内存和CPU的消耗
    • 慎用join操作:单张表查询可以减少锁的竞争,更容易应对业务的发展,方便对数据库进行拆分
    • 慎用子查询和临时表:未带索引的字段上的group by操作,UNION查询,部分order by操作,例如distinct函数和order by一起使用且distinctorder by同一个字段
    • 尽量不适用limit,部分场景可改用bewteen and

四、高级面试题之Mysql千万级别数据如何做分页?

  • 后端开发中为了防止一次性加载太多数据导致内存、磁盘IO都开销过大,经常需要分页展示,这个时候就需要用到MySQL的LIMIT关键字。但你以为LIMIT分页就万事大吉了么,LIMIT在数据量大的时候极可能造成深度分页问题

MySQL性能优化分析——第三课插图6

  • 通过explain分析深度分页查询问题 explain select * from user where age>10 and age<90000000 order by age desc limit 8000000,10000;
  • 执行计划Extra列可能出现的值及含义:

    1. Using where:表示优化器需要通过索引回表查询数据。
    2. Using index:即覆盖索引,表示直接访问索引就足够获取到所需要的数据,不需要通过索引回表,通常是通过将待查询字段建立联合索引实现。
    3. Using index condition:在5.6版本后加入的新特性,即大名鼎鼎的索引下推,是MySQL关于减少回表次数的重大优化。
    4. Using filesort:文件排序,这个一般在ORDER BY时候,数据量过大,MySQL会将所有数据召回内存中排序,比较消耗资源。
  • 解决方案
    • 通过主键索引优化
      • 在查询条件中带上主键索引 explain select * from user where id>{maxId} age>10 and age<90000000 order by age desc limit 8000000,10000;
    • Elastic Search搜索引擎优化(倒排索引)
    • 实际上类似于淘宝这样的电商基本上都是把所有商品放进ES搜索引擎里的(那么海量的数据,放进MySQL是不可能的,放进Redis也不现实)。但即使用了ES搜索引擎,也还是有可能发生深度分页的问题的,这时怎么办呢?答案是通过游标scroll

发表评论 取消回复
表情 图片 链接 代码

分享