优化这段sql: SELECT * FROM scrm_customer_inherit_record WHERE result = 0 AND operate_type = 0 AND TIMESTAMPDIFF( HOUR, create_time, NOW()) > 24;
时间: 2023-11-27 10:51:02 浏览: 89
可以考虑对该 SQL 进行如下优化:
1. 避免使用 *,只查询需要的字段,减少数据传输和查询时间。
2. 使用常量或变量替换 NOW() 函数,以避免在每次查询时重复计算当前时间。
3. 将常量或变量替换为绑定参数,以避免 SQL 注入攻击。
4. 对操作类型和结果建立索引,以加快查询速度。
5. 对创建时间建立索引,以加快时间比较的速度。
优化后的 SQL 如下:
```
SELECT id, customer_id, result, operate_type, create_time
FROM scrm_customer_inherit_record
WHERE result = 0
AND operate_type = 0
AND create_time < DATE_SUB(NOW(), INTERVAL 24 HOUR);
```
同时需要在 result、operate_type 和 create_time 字段上建立索引。
相关问题
优化sql: SELECT * FROM scrm_customer_inherit_record WHERE result = 0 AND operate_type = 0 AND create_time < '2023-5-22 14:54:30';
可以考虑以下优化方法:
1. 索引优化:对 `result`、`operate_type` 和 `create_time` 字段分别建立索引,可以加快查询速度。
2. 避免使用通配符:使用 `SELECT *` 可能会导致查询的字段过多,可以只查询需要的字段,避免使用通配符。
3. 使用时间戳代替日期:将日期转换为时间戳可以提高查询效率。
优化后的 SQL 可以是这样的:
```
SELECT id, field1, field2, ... FROM scrm_customer_inherit_record
WHERE result = 0 AND operate_type = 0 AND create_time < UNIX_TIMESTAMP('2023-5-22 14:54:30');
```
其中,`id` 和 `field1, field2, ...` 分别代表需要查询的字段。`UNIX_TIMESTAMP` 函数可以将日期转换为时间戳,可以更快地比较时间大小。同时,建议在 `result`、`operate_type` 和 `create_time` 字段上建立索引,以提高查询效率。
UPDATE scrm_cp_user SET is_valid_ = 0 WHERE external_user_id_ NOT IN <foreach collection="cpUserUserInfoVOList" item="item" separator="," open="(" close=")"> #{item.externalUserId} </foreach> AND NOT EXISTS ( SELECT 1 FROM scrm_cp_user_user_binding scuub WHERE scuub.cp_user_id_ = scrm_cp_user.id_ AND scuub.is_valid_ = 1 ) ,in超过1000如何解决
如果 IN 子句中的值超过1000个,可以使用分批次处理来解决。例如,您可以将 IN 子句拆分为多个子句,每个子句包含1000个值。然后,您可以使用 UNION ALL 运算符将这些子句组合起来。以下是一个示例代码:
```
UPDATE scrm_cp_user
SET is_valid_ = 0
WHERE external_user_id_ NOT IN (
SELECT external_user_id_
FROM (
SELECT external_user_id_
FROM cpUserUserInfoVOList
ORDER BY external_user_id_
OFFSET 0 ROWS FETCH NEXT 1000 ROWS ONLY
UNION ALL
SELECT external_user_id_
FROM cpUserUserInfoVOList
ORDER BY external_user_id_
OFFSET 1000 ROWS FETCH NEXT 1000 ROWS ONLY
-- 继续添加子句,每个子句包含1000个值
) AS subquery
)
AND NOT EXISTS (
SELECT 1
FROM scrm_cp_user_user_binding scuub
WHERE scuub.cp_user_id_ = scrm_cp_user.id_
AND scuub.is_valid_ = 1
)
```
在此示例中,我们将 cpUserUserInfoVOList 表中的值拆分为多个子句,每个子句包含1000个值。我们使用 OFFSET 和 FETCH NEXT 子句来指定每个子句的范围。最后,我们使用 UNION ALL 运算符将这些子句组合在一起。
阅读全文