美文网首页Mysql
mysql-黑马-day02- 优化与索引

mysql-黑马-day02- 优化与索引

作者: 垃圾简书_吃枣药丸 | 来源:发表于2020-10-09 18:53 被阅读0次
    image.png image.png image.png
    • 存储引擎是作用在表上的
    image.png
    image.png
    • 事务
    -- Innodb
    -- 事物
    -- 开启事务
    start transaction;
    
    -- 操作
    insert into project_user_visit(id, visit_user_name)
    values ('10', '喜欢天文的pony');
    
    -- 提交事务
    commit;
    -- 回滚事务
    rollback;
    
    • MyISAM


      image.png
    image.png image.png

    三、 SQL优化

    1. 查看sql语句的执行频次,哪些操作执行的比较频繁(以插入还是查询为主)
    show global status;
    -- 查询操作次数
    show global status like 'Com_______';
    -- 查询Innodb存储引擎下操作的行的数量
    show global status like 'Innodb_rows_%';
    
    1. 定位效率低的SQL


      image.png
    -- 查看实时状态-检测每个客户端正在执行的慢SQL
    show processlist;
    
    1. explain分析执行计划
      image.png
    • id

      • 如果id值一样,则按照从上到下顺序查询,
      • 如果id不一样,则按照数值从大到小查询表。
    • select_type


      image.png
    • table

      • 查询的是哪张表
    • type


      image.png
      image.png
    • possible_keys

      • 可能用到的索引
    • key

      • 实际用到的索引
    • key_len

      • 索引的长度(越短越好)
    • rows

      • 扫描的行数
    • extra


      image.png
    1. show profiles分析SQL
    -- 是否开启
    select @@have_profiling;
    -- 在当前Session会话开启profiling
    select @@profiling;
    -- 在当前会话开启profiling;
    set profiling = 1;
    -- 查看记录
    show profiles;
    
    image.png
    • 各阶段时间分析 show profile for query [id]
      image.png
     show profile all for query 2;
     show profile cpu for query 2;
    
    1. 优化器


      image.png

    四、索引的使用

    • 索引能解决大多数mysql的查询性能问题。
    • 正确创建索引,并且正确使用索引,才能提高查询效率。
    • 避免索引失效:
    • 创建索引
    create index idx_username_usermobile_cityname on project_user_visit(visit_user_name,visit_user_mobile,visit_city);
    
    1. 全值匹配,对索引中所有的列都指定具体值。
    explain select * from project_user_visit where visit_user_name='天文' and visit_user_mobile='123' and visit_city='上海市';
    
    image.png
    1. 最左前缀法则
    • 如果索引了多列,要遵守最左前缀法则,指的是查询从索引的最左列开始,并且不能跳过索引中的列。(查询条件需要包含索引中的最左列,且不能跳过索引中的某一列
    image.png
    image.png

    与查询条件出现的顺序无关,只与是否出现索引的最左列有关。

    image.png
    • 如果跳过了索引中的某些列,则只有前几列索引有效。如下面的例子中,其实只走了visit_user_name的索引。


      image.png
    1. 范围查询右边的列,不能使用索引。


      image.png
      image.png
    2. 不要在索引列上进行运算操作,否则索引将失效


      image.png
    3. 字符串不加单引号会导致索引失效

    • why:因为mysql会对字段进行隐式转换,而这个转换过程被认为是对字段的运算操作。导致索引失效。
    1. 尽量查询覆盖索引(索引完全包含查询列),不要使用select *,避免回表查询。

    2. 两个OR关联的条件,OR之后的条件没有索引,则整个查询都不走索引。

    explain
    select *
    from project_user_visit
    where visit_user_name = '天文'
       or visit_user_position_name = '促销员';
    
    image.png
    1. 以%开头的like查询不走索引,只加在后面走索引。


      image.png
    • 解决方案:使用覆盖索引


      image.png
    1. 如果Mysql评估使用索引比全表扫描更慢,则不走索引。

    2. is null, is not null,有时走索引,有时不走索引。

    • 需要看数据列,mysql会判断走索引还是全表扫描更快。
      • 比如某一列的值的数据基本都是null,那么在查询is null的时候,就不会走索引,而是全表扫描。
    1. in走索引。not in 不走索引。---测试下来结果不对

    我测试下来如果查询的列被索引字段覆盖了就都走,如果没覆盖就都不走
    还要看in里面的内容,如果过长也不会走索引。

    image.png
    1. 尽量使用复合索引,而少使用单列索引。
      如: create index idx_xx on tab(a,b,c);
      相当于建立了三个索引
    • a
    • a + b
    • a + b + c
      如果分别在单个索引上建立索引,则只会走一个最佳的索引,不会每个索引都走。所以效率没有组合索引高。

    查看索引的使用情况

    -- 查看索引的使用情况
    show global status like 'Handler_read%';
    
    image.png

    五、 SQL优化

    1. 大批量插入数据

    1. 在Innodb存储引擎下,使导入的主键是有序的。


      image.png
    image.png
    1. 关闭唯一性校验


      image.png
    2. 手动提交事务


      image.png

    2. 优化insert语句

    image.png
    • values(),(),()组合在一起,使用一条sql插入。
    • 事务提交改为手动提交,并批量开启事务,如每1W条提交一次。
    • 主键顺序插入。

    3. 排序优化

    image.png image.png image.png

    4. group by语句优化

    image.png

    5. 优化嵌套查询

    • 使用多表连接查询代替子查询


      image.png

    6. OR的优化

    • 需要保证OR的每个查询条件都有索引,如果有一个条件没有索引,则整个OR条件都不走索引。
    • 使用union代替OR

    7. 优化分页查询

    image.png

    8. 使用sql提示

    image.png image.png image.png

    相关文章

      网友评论

        本文标题:mysql-黑马-day02- 优化与索引

        本文链接:https://www.haomeiwen.com/subject/zhtlpktx.html