实测确认 #21 描述准确:fin_risk_alert 只有 11 个普通 BTREE 索引 + 主键 + alert_no 唯一键,规则命中的 JSON_CONTAINS 查询 EXPLAIN 为 type=ALL、possible_keys=NULL, 即全表扫。MySQL 8.0.27 支持多值索引,故新增迁移 20260911_risk_rule_index: ADD INDEX idx_fin_risk_alert_trigger_rule_codes ((CAST(`trigger_rule_codes` AS CHAR(16) ARRAY))) 迁移幂等(先查 information_schema.STATISTICS),upgrade/downgrade 往返已验证。 生效后 EXPLAIN 变为 access_type=range 且 key 命中该索引,原始证据留档在 docs/evidence/risk-index-probe.json(由 tools/probe_risk_index.py 生成,只读探查)。 只解决一半,另一半如实记为限制:若干 like(f"%{keyword}%") 全表扫无法用 B-tree 索引, 根治需全文索引 + 中文分词组件(部署依赖),本轮不做。 revision 名刻意压到 32 字符以内 —— alembic_version.version_num 是 VARCHAR(32), 超长会在写版本号时报 1406,而 DDL 是非事务的,那时索引已经建好了。 docs/25 追加"P3 处理结果"表,逐条登记 17-25 的状态:#19 是协议级重做(keyset 分页) 不单方面改,#21 部分修复,#25 前半段不成立,其余已修。
154 lines
3.9 KiB
JSON
154 lines
3.9 KiB
JSON
{
|
|
"mysql_version": "8.0.27",
|
|
"column": [
|
|
{
|
|
"COLUMN_NAME": "trigger_rule_codes",
|
|
"COLUMN_TYPE": "json",
|
|
"DATA_TYPE": "json",
|
|
"IS_NULLABLE": "NO"
|
|
}
|
|
],
|
|
"indexes": [
|
|
{
|
|
"INDEX_NAME": "idx_fin_risk_alert_alert_level",
|
|
"COLUMN_NAME": "alert_level",
|
|
"INDEX_TYPE": "BTREE",
|
|
"EXPRESSION": null
|
|
},
|
|
{
|
|
"INDEX_NAME": "idx_fin_risk_alert_alert_type",
|
|
"COLUMN_NAME": "alert_type",
|
|
"INDEX_TYPE": "BTREE",
|
|
"EXPRESSION": null
|
|
},
|
|
{
|
|
"INDEX_NAME": "idx_fin_risk_alert_created_at",
|
|
"COLUMN_NAME": "created_at",
|
|
"INDEX_TYPE": "BTREE",
|
|
"EXPRESSION": null
|
|
},
|
|
{
|
|
"INDEX_NAME": "idx_fin_risk_alert_customer_id",
|
|
"COLUMN_NAME": "customer_id",
|
|
"INDEX_TYPE": "BTREE",
|
|
"EXPRESSION": null
|
|
},
|
|
{
|
|
"INDEX_NAME": "idx_fin_risk_alert_due_at",
|
|
"COLUMN_NAME": "due_at",
|
|
"INDEX_TYPE": "BTREE",
|
|
"EXPRESSION": null
|
|
},
|
|
{
|
|
"INDEX_NAME": "idx_fin_risk_alert_handler_id",
|
|
"COLUMN_NAME": "handler_id",
|
|
"INDEX_TYPE": "BTREE",
|
|
"EXPRESSION": null
|
|
},
|
|
{
|
|
"INDEX_NAME": "idx_fin_risk_alert_primary_risk_work_order_id",
|
|
"COLUMN_NAME": "primary_risk_work_order_id",
|
|
"INDEX_TYPE": "BTREE",
|
|
"EXPRESSION": null
|
|
},
|
|
{
|
|
"INDEX_NAME": "idx_fin_risk_alert_priority_score",
|
|
"COLUMN_NAME": "priority_score",
|
|
"INDEX_TYPE": "BTREE",
|
|
"EXPRESSION": null
|
|
},
|
|
{
|
|
"INDEX_NAME": "idx_fin_risk_alert_related_order_id",
|
|
"COLUMN_NAME": "related_order_id",
|
|
"INDEX_TYPE": "BTREE",
|
|
"EXPRESSION": null
|
|
},
|
|
{
|
|
"INDEX_NAME": "idx_fin_risk_alert_related_transaction_id",
|
|
"COLUMN_NAME": "related_transaction_id",
|
|
"INDEX_TYPE": "BTREE",
|
|
"EXPRESSION": null
|
|
},
|
|
{
|
|
"INDEX_NAME": "idx_fin_risk_alert_related_work_order_id",
|
|
"COLUMN_NAME": "related_work_order_id",
|
|
"INDEX_TYPE": "BTREE",
|
|
"EXPRESSION": null
|
|
},
|
|
{
|
|
"INDEX_NAME": "idx_fin_risk_alert_status",
|
|
"COLUMN_NAME": "status",
|
|
"INDEX_TYPE": "BTREE",
|
|
"EXPRESSION": null
|
|
},
|
|
{
|
|
"INDEX_NAME": "idx_fin_risk_alert_trigger_rule_codes",
|
|
"COLUMN_NAME": null,
|
|
"INDEX_TYPE": "BTREE",
|
|
"EXPRESSION": "cast(`trigger_rule_codes` as char(16) array)"
|
|
},
|
|
{
|
|
"INDEX_NAME": "PRIMARY",
|
|
"COLUMN_NAME": "id",
|
|
"INDEX_TYPE": "BTREE",
|
|
"EXPRESSION": null
|
|
},
|
|
{
|
|
"INDEX_NAME": "uk_fin_risk_alert_alert_no",
|
|
"COLUMN_NAME": "alert_no",
|
|
"INDEX_TYPE": "BTREE",
|
|
"EXPRESSION": null
|
|
}
|
|
],
|
|
"row_count": 3,
|
|
"non_array_rows": 0,
|
|
"distinct_rule_codes": [
|
|
{
|
|
"raw_codes": "[\"RW-007\", \"RW-002\", \"RW-012\"]",
|
|
"rows_count": 1
|
|
},
|
|
{
|
|
"raw_codes": "[\"RW-015\", \"RW-003\"]",
|
|
"rows_count": 1
|
|
},
|
|
{
|
|
"raw_codes": "[\"RW-018\"]",
|
|
"rows_count": 1
|
|
}
|
|
],
|
|
"explain_json_contains": {
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "0.71"
|
|
},
|
|
"table": {
|
|
"table_name": "fin_risk_alert",
|
|
"access_type": "range",
|
|
"possible_keys": [
|
|
"idx_fin_risk_alert_trigger_rule_codes"
|
|
],
|
|
"key": "idx_fin_risk_alert_trigger_rule_codes",
|
|
"used_key_parts": [
|
|
"cast(`trigger_rule_codes` as char(16) array)"
|
|
],
|
|
"key_length": "67",
|
|
"rows_examined_per_scan": 1,
|
|
"rows_produced_per_join": 1,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.61",
|
|
"eval_cost": "0.10",
|
|
"prefix_cost": "0.71",
|
|
"data_read_per_join": "936"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"trigger_rule_codes",
|
|
"cast(`trigger_rule_codes` as char(16) array)"
|
|
],
|
|
"attached_condition": "json_contains(cast(`trigger_rule_codes` as char(16) array),json'[\"RW-018\"]')"
|
|
}
|
|
}
|
|
}
|
|
} |