Mysql 優化

直奔主題

有四張表需要關聯查詢
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倍 !

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容