-- 执行有问题的关联查询 SELECT lct.id as task_id, lct.task_name, rtwm.id as report_id, rtwm.task_id as related_task_id, rtwm.report_name FROM lb_core_task lct LEFTJOIN report_to_work_main rtwm ON rtwm.task_id = lct.id;
-- 查看执行计划,分析性能影响 EXPLAIN SELECT lct.id as task_id, rtwm.id as report_id FROM lb_core_task lct LEFTJOIN report_to_work_main rtwm ON rtwm.task_id = lct.id;
-- 典型的执行计划问题: -- 1. type: ALL (全表扫描) -- 2. key: NULL (无法使用索引) -- 3. rows: 大量行数需要扫描 -- 4. Extra: Using where; Using join buffer
-- 步骤1:备份数据(重要!) CREATE TABLE report_to_work_main_backup AS SELECT*FROM report_to_work_main;
-- 步骤2:检查数据兼容性 -- 确保varchar字段中的数据都能转换为bigint SELECT task_id, CASE WHEN task_id REGEXP '^[0-9]+$'THEN'Valid' ELSE'Invalid' ENDas validation_result FROM report_to_work_main WHERE validation_result ='Invalid';
-- 步骤3:清理无效数据(如果有) -- 根据业务需求处理无效数据 UPDATE report_to_work_main SET task_id =NULL WHERE task_id NOT REGEXP '^[0-9]+$';
-- 步骤4:修改字段类型 ALTER TABLE report_to_work_main MODIFY COLUMN task_id bigint(20);
-- 方法1:将字符串转换为数字(推荐用于数字ID) SELECT lct.id as task_id, lct.task_name, rtwm.id as report_id, rtwm.task_id as related_task_id, rtwm.report_name FROM lb_core_task lct LEFTJOIN report_to_work_main rtwm ONCAST(rtwm.task_id AS SIGNED) = lct.id WHERE rtwm.task_id REGEXP '^[0-9]+$'; -- 确保只匹配纯数字字符串
-- 方法2:将数字转换为字符串(适用于字符串ID场景) SELECT lct.id as task_id, rtwm.id as report_id FROM lb_core_task lct LEFTJOIN report_to_work_main rtwm ON rtwm.task_id =CAST(lct.id ASCHAR);
-- 方法3:使用CONVERT函数(与CAST类似) SELECT lct.id as task_id, rtwm.id as report_id FROM lb_core_task lct LEFTJOIN report_to_work_main rtwm ONCONVERT(rtwm.task_id, SIGNED) = lct.id;
-- 场景:task_id字段存储多个ID,如"123,456,789" -- 使用FIND_IN_SET函数 SELECT lct.id as task_id, lct.task_name, rtwm.id as report_id, rtwm.task_id as related_task_ids FROM lb_core_task lct LEFTJOIN report_to_work_main rtwm ON FIND_IN_SET(lct.id, rtwm.task_id) >0;
-- 场景:task_id字段包含ID作为子字符串 -- 使用LIKE进行模糊匹配(谨慎使用) SELECT lct.id as task_id, rtwm.id as report_id FROM lb_core_task lct LEFTJOIN report_to_work_main rtwm ON rtwm.task_id LIKE CONCAT('%', lct.id, '%');
-- 更安全的模糊匹配(避免部分匹配问题) SELECT lct.id as task_id, rtwm.id as report_id FROM lb_core_task lct LEFTJOIN report_to_work_main rtwm ON ( rtwm.task_id =CAST(lct.id ASCHAR) OR rtwm.task_id LIKE CONCAT(lct.id, ',%') OR rtwm.task_id LIKE CONCAT('%,', lct.id, ',%') OR rtwm.task_id LIKE CONCAT('%,', lct.id) );
-- 1. 定期检查表结构一致性 SELECT t1.TABLE_NAME as table1, t1.COLUMN_NAME as column1, t1.DATA_TYPE as type1, t2.TABLE_NAME as table2, t2.COLUMN_NAME as column2, t2.DATA_TYPE as type2 FROM information_schema.COLUMNS t1 JOIN information_schema.COLUMNS t2 ON ( t1.COLUMN_NAME = t2.COLUMN_NAME AND t1.TABLE_NAME != t2.TABLE_NAME AND t1.DATA_TYPE != t2.DATA_TYPE ) WHERE t1.TABLE_SCHEMA ='your_database_name'AND t2.TABLE_SCHEMA ='your_database_name' AND t1.COLUMN_NAME LIKE'%_id'; -- 检查ID字段