程序员该如何进行 SQL 数据库的优化?( 二 )

  • 三张表关联 , 查询当前用户在当前时间前后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 数据库的优化?

文章插图
原执行时间
程序员该如何进行 SQL 数据库的优化?

文章插图
原执行计划
程序员该如何进行 SQL 数据库的优化?

文章插图
初步优化思路
  1. SQL中 where条件字段类型要跟表结构一致 , 表中user_id 为varchar(50)类型 , 实际SQL用的int类型 , 存在隐式转换 , 也未添加索引 。将b和c表user_id 字段改成int类型;
  2. 因存在b表和c表关联 , 将b和c表user_id创建索引;
  3. 因存在a表和b表关联 , 将a和b表seller_name字段创建索引;
  4. 利用复合索引消除临时表和排序 。
初步优化SQL
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`); 查看优化后执行时间

程序员该如何进行 SQL 数据库的优化?

文章插图
查看优化后执行计划
程序员该如何进行 SQL 数据库的优化?

文章插图
查看warnings信息
程序员该如何进行 SQL 数据库的优化?

文章插图
继续优化


推荐阅读