Mysql 优化

2017-10-25  本文已影响20人  php_johson

直奔主题

有四张表需要关联查询
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倍 !

上一篇 下一篇

猜你喜欢

热点阅读