美文网首页
Mysql 优化

Mysql 优化

作者: php_johson | 来源:发表于2017-10-25 13:13 被阅读20次

    直奔主题

    有四张表需要关联查询
    ticket_reserve :票品预约表
    program :节目表
    program_scene :节目下的场次表
    city :城市表

    需求:预约记录列表 (需包含预约的场次,场次所属的城市,场次所属的节目)

    select 
      `ticket_reserve`.*, 
      `ticket_reserve`.`created_at` as `tcreated_at`, 
      `ticket_reserve`.`id` as `rid`, 
      `program`.*, 
      `program_scene`.*, 
      `city`.* 
    from 
      `ticket_reserve` 
      left join `program` on `program`.`uuid` = `ticket_reserve`.`program_id` 
      left join `program_scene` on `program_scene`.`uuid` = `ticket_reserve`.`scene_id` 
      left join `city` on `city`.`code` = `ticket_reserve`.`city_id` 
    where 
      `reserve_mode` in (0, 2) 
      and `resserve_status` != 3 
    order by 
      `ticket_reserve`.`created_at` desc 
    limit 
      10 offset 0;
    

    5秒。。。。。。。。。。。。。扎心了

    一定有问题,先看下索引吧。

    program表没有问题,与主表关联的uuid字段建立了唯一索引

    program_scene表 uuid字段 也是唯一索引

    city表 code字段 也是唯一索引

    ticket_reserve 只有主键

    不应该啊,索引都没有问题,难道是数据量太大了?

    最多的数据也没有超过5000
    那么是什么导致速度回这么慢呢

    explain之后 发现一个索引也没有用到

    查看ticket_reserve表结构,发现所有的行的字符集都是utf8mb4,而其余三张表都是默认的utf8字符

    先改为utf8试试(null也会影响到性能,一并优化掉)

    alter table 
      ticket_reserve modify `program_id` varchar(255) NOT NULL DEFAULT '' comment '关联节目ID'; 
    alter table 
      ticket_reserve modify `scene_id` varchar(255) NOT NULL DEFAULT '' comment '关联场次ID'; 
    alter table 
      ticket_reserve modify `city_id` varchar(255) NOT NULL DEFAULT '' comment '关联城市ID';
    

    果然是字符集不同影响到了索引

    再来看下速度

    这就正常多了 10毫秒 整个提升了544倍 !

    相关文章

      网友评论

          本文标题:Mysql 优化

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