在新建一張賬單結算信息表bill_settlement_info的時候,建立的唯一索引uk_bill_no(bill_no,tenant_id)。由於列表查詢用到該表的欄位。所以在sql中自然做了jeft join查詢。 on條件是bill.billNo=bill_settlement_info.b ...
在新建一張賬單結算信息表bill_settlement_info的時候,建立的唯一索引uk_bill_no(bill_no,tenant_id)。由於列表查詢用到該表的欄位。所以在sql中自然做了jeft join查詢。
on條件是bill.billNo=bill_settlement_info.billNo。
自然認為這樣的鏈表會走bill_settlement_info的索引。但是上線生產後,由於生產數據增長很快。立馬發現列表查詢時,使用bill_settlement_info表中的欄位過濾數據時。查詢超時。
排查後發現是慢SQL導致。
使用explan分析查詢語句發現是連表bill_settlement_info查詢時。沒有走索引。連表語句:
select * from bill left join bill_settlement_info on bill.bill_no = bill_settlement_info.bill_no
在on條件中加上tenant_id後,重新explan後發現走了索引
select * from bill left join bill_settlement_info on bill.bill_no = bill_settlement_info.bill_no and bill.tenant_id = bill_settlement_info.tenant_id
所以能得出結論。MySql的唯一索引是嚴格按照左匹配原則的。