直奔主題
有四張表需要關(guān)聯(lián)查詢
ticket_reserve :票品預(yù)約表
program :節(jié)目表
program_scene :節(jié)目下的場次表
city :城市表
需求:預(yù)約記錄列表 (需包含預(yù)約的場次什荣,場次所屬的城市嗜闻,場次所屬的節(jié)目)
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表沒有問題篷朵,與主表關(guān)聯(lián)的uuid字段建立了唯一索引
program_scene表 uuid字段 也是唯一索引
city表 code字段 也是唯一索引
ticket_reserve 只有主鍵
不應(yīng)該啊,索引都沒有問題澈缺,難道是數(shù)據(jù)量太大了?
最多的數(shù)據(jù)也沒有超過5000
那么是什么導(dǎo)致速度回這么慢呢
explain之后 發(fā)現(xiàn)一個索引也沒有用到
查看ticket_reserve表結(jié)構(gòu),發(fā)現(xiàn)所有的行的字符集都是utf8mb4,而其余三張表都是默認(rèn)的utf8字符
先改為utf8試試(null也會影響到性能,一并優(yōu)化掉)
alter table
ticket_reserve modify `program_id` varchar(255) NOT NULL DEFAULT '' comment '關(guān)聯(lián)節(jié)目ID';
alter table
ticket_reserve modify `scene_id` varchar(255) NOT NULL DEFAULT '' comment '關(guān)聯(lián)場次ID';
alter table
ticket_reserve modify `city_id` varchar(255) NOT NULL DEFAULT '' comment '關(guān)聯(lián)城市ID';
果然是字符集不同影響到了索引
這就正常多了 10毫秒 整個提升了544倍 傻谁!