- 三张表关联 , 查询当前用户在当前时间前后10个小时的订单情况 , 并根据订单创建时间升序排列 , 具体SQL如下
select a.seller_id,a.seller_name,b.user_name,c.statefrom a,b,cwhere a.seller_name = b.seller_nameand b.user_id = c.user_idand c.user_id = 17and a.gmt_createBETWEEN DATE_ADD(NOW, INTERVAL – 600 MINUTE)AND DATE_ADD(NOW, INTERVAL 600 MINUTE)order by a.gmt_create;
查看数据量文章插图
原执行时间
文章插图
原执行计划
文章插图
初步优化思路
- SQL中 where条件字段类型要跟表结构一致 , 表中user_id 为varchar(50)类型 , 实际SQL用的int类型 , 存在隐式转换 , 也未添加索引 。将b和c表user_id 字段改成int类型;
- 因存在b表和c表关联 , 将b和c表user_id创建索引;
- 因存在a表和b表关联 , 将a和b表seller_name字段创建索引;
- 利用复合索引消除临时表和排序 。
alter table b modify `user_id` int(10) DEFAULT ;alter table c modify `user_id` int(10) DEFAULT ;alter table c add index `idx_user_id`(`user_id`);alter table b add index `idx_user_id_sell_name`(`user_id`,`seller_name`);alter table a add index `idx_sellname_gmt_sellid`(`gmt_create`,`seller_name`,`seller_id`);
查看优化后执行时间文章插图
查看优化后执行计划
文章插图
查看warnings信息
文章插图
继续优化
推荐阅读
- 程序员必知必会的零拷贝技术
- 人脸识别系统全过程讲解,告诉你是如何找到人的
- 如何使用 Ansible 同步 GitHub 和 GitLab
- 一篇文章告诉你新手如何快速制作小程序,干货满满,建议收藏
- 如何在 Ubuntu 和其它 Linux 发行版上更新 grub
- 倒春寒来袭 如何保护宝宝不生病
- 抵御“倒春寒” 人参、西洋参、党参该怎样吃?
- 春季如何做好中医保健养生
- 春季如何给肌肤保湿?7大对策让你肌肤水嫩嫩!
- 如何选购棕榈床垫 棕榈床垫品牌