perf(query): 优化后台手机号精确查询

This commit is contained in:
yml2213
2026-11-02 18:28:12 +08:00
parent 9c379b7e0c
commit 599e22331d
17 changed files with 254 additions and 62 deletions
+13 -4
View File
@@ -241,7 +241,7 @@ func (r *Repository) adminOrderCountQuery(ctx context.Context, query AdminOrderQ
upper := strings.ToUpper(kw)
needsJoin := false
if kw != "" {
if strings.HasPrefix(upper, "RO") || strings.HasPrefix(upper, "ORD") {
if isPhoneKeyword(kw) || strings.HasPrefix(upper, "RO") || strings.HasPrefix(upper, "ORD") {
needsJoin = false
} else if id, err := strconv.ParseUint(kw, 10, 64); err == nil && id > 0 && kw[0] != '0' && len(kw) < 9 {
needsJoin = false
@@ -334,9 +334,14 @@ func applyAdminOrderFilters(db *gorm.DB, query AdminOrderQuery) *gorm.DB {
}
if keyword := strings.TrimSpace(query.Keyword); keyword != "" {
upper := strings.ToUpper(keyword)
if len(keyword) == 11 && keyword[0] == '1' && isAllDigits(keyword) {
// 11 位手机号:命中 users(phone) 唯一索引
db = db.Where("(owner.phone = ? OR renter.phone = ?)", keyword, keyword)
if isPhoneKeyword(keyword) {
// 先由 users(phone) 唯一索引解析用户,再让订单表 owner_id/renter_id 索引驱动。
// 不能直接写 owner.phone/renter.phone:跨表别名 OR 会让 MySQL 倒序扫描全部订单。
db = db.Where(
"(o.owner_id = (SELECT id FROM users WHERE phone = ?) OR o.renter_id = (SELECT id FROM users WHERE phone = ?))",
keyword,
keyword,
)
} else if strings.HasPrefix(upper, "RO") || strings.HasPrefix(upper, "ORD") {
// 订单号:命中 rental_orders(order_no) 唯一索引
db = db.Where("o.order_no = ?", keyword)
@@ -532,3 +537,7 @@ func isAllDigits(s string) bool {
}
return len(s) > 0
}
func isPhoneKeyword(s string) bool {
return len(s) == 11 && s[0] == '1' && isAllDigits(s)
}
@@ -511,9 +511,9 @@ func TestApplyAdminOrderFiltersSmartRouting(t *testing.T) {
wantSQLFrag string
}{
{
name: "11位手机号路由至users(phone)",
name: "11位手机号先解析用户再走订单角色索引",
query: AdminOrderQuery{Keyword: "13800138000"},
wantSQLFrag: "owner.phone = ? OR renter.phone = ?",
wantSQLFrag: "o.owner_id = (SELECT id FROM users WHERE phone = ?)",
},
{
name: "RO前缀订单号路由至rental_orders(order_no)",