现有一sql
select
id,
apiSettleAmount,
tmpAmount,
taskNumber,
amazonOrderId,
planName,
round(amount,2) as amount,
singleCost,
settleStatus,
shopUser,
round(amount+commission,2) as settleAmount,
createTime,
settleTime,
tax,
commission,
planedAmount,
userAccount,
asin,
productId
from
( select
sas.id as id,
sas.api_settle_amount as apiSettleAmount,
sas.tmp_planed_amount as tmpAmount,
sas.task_number as taskNumber,
sas.amazon_order_id as amazonOrderId,
sas.plan_name as planName,
sas.amount*7.5 as amount,
sas.single_cost as singleCost,
sas.settle_status as settleStatus,
sas.shop_user as shopUser,
sas.settle_amount as settleAmount,
sas.create_time as createTime,
sas.settle_time as settleTime,
sas.tax as tax,
sas.commission as commission,
sas.planed_amount as planedAmount,
su.phonenumber as userAccount,
sp.asin as asin,
tk.product_id as productId
from online_client.shop_api_settle sas
left join online_client.shop_user su on sas.shop_user = su.user_id
left join online_client.shop_plan sp on sas.plan_name = sp.plan_name
left join online_client.task_order tk ON sas.task_number = tk.task_number
WHERE NOT ((tk.del_flag = 1 AND sas.settle_status = 0) or sas.settle_status = 2)
GROUP BY tk.task_number) as b
优化步骤
1.explan sql 查看sql的运行计划
先针对全表扫描的大数据,连接条件较少的表进行优化 ,如先优化 sp
2.查看 shop_plan 用到的字段 plan_name是否加索引,如果未加,权衡之后考虑是否加上
(考虑因素:该字段在项目 中用到的次数,该字段所在表的数据量,其他因素),
加的索引方法:如果该字段多次以是否存在用到,使用HASH,如果多次取值,使用BTREE,emmm这个应该知道
3.加了索引,sql还是没有走索引的话,考虑两个表的字段的字符集是否一致
4.如果还是走全表索引的话,可以无脑加上 where id >1 (有点无耻)