【TiDB 版本】 5.0.3
【问题】 SQL中 条件a.user_id=xxxx and b.user_id=a.user_id,同时包含条件b.partition_id=mod(p.user_id,4)时导致1. 2表不能使用indexjoin 2. b表不能使用索引或小范围table range scan
CREATE TABLE test1
(
TRADE_ID
bigint(16) NOT NULL,
SUBSCRIBE_ID
bigint(16) NOT NULL,
USER_ID
bigint(16) DEFAULT NULL,
ACCEPT_MONTH
int(2) NOT NULL,
CANCEL_TAG
char(1) NOT NULL,
PRIMARY KEY (TRADE_ID
,ACCEPT_MONTH
,CANCEL_TAG
) /*T![clustered_index] NONCLUSTERED */,
KEY idx1
(USER_ID
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
CREATE TABLE test2
(
USER_ID
bigint(16) unsigned NOT NULL,
CUST_ID
bigint(16) NOT NULL,
partition_id
int(11) DEFAULT NULL,
PRIMARY KEY (USER_ID
) /*T![clustered_index] CLUSTERED */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
SQL: select * from test1 a, test2 b where a.trade_id=3621052674110830 and b.user_id = a.user_id and b.partition_id=mod(b.user_id,4);
强制索引不起作用
mysql上b表走索引
show warnings;
±--------±-----±------------------------------------------------------------------------------------------+
| Level | Code | Message |
±--------±-----±------------------------------------------------------------------------------------------+
| Warning | 1105 | Scalar function ‘mod’(signature: ModIntUnsignedSigned) can not be pushed to storage layer |
±--------±-----±------------------------------------------------------------------------------------------+
感觉上述现象跟不能动态分区裁剪类似。