直奔主题
有四张表需要关联查询
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倍 !
网友评论