SELECT * FROM (SELECT * FROM `bus_drugs` WHERE `drugs_standard_code` in( SELECT drugs_standard_code FROM `bus_drugs` GROUP BY `drugs_standard_code` , `drugs_specification` HAVING COUNT( `drugs_standard_code`)> 1 ) and `drugs_specification` in( SELECT drugs_specification FROM `bus_drugs` GROUP BY `drugs_standard_code` , `drugs_specification` HAVING COUNT( `drugs_standard_code`)> 1 ) ) t1 left join `bus_enterprise_drugs` t2 on t1.id = t2.`drugs_id`;帮我优化sql
时间: 2023-10-19 15:07:34 浏览: 94
SQL 的 SELECT 语句优化
对于优化这个 SQL 查询,有几个方面可以考虑:
1. 使用 JOIN 替代子查询:可以将子查询转换为 JOIN 操作,以提高性能。以下是优化后的 SQL 查询:
```sql
SELECT t1.*, t2.*
FROM (
SELECT bd.*
FROM `bus_drugs` bd
JOIN (
SELECT `drugs_standard_code`, `drugs_specification`
FROM `bus_drugs`
GROUP BY `drugs_standard_code`, `drugs_specification`
HAVING COUNT(*) > 1
) sub ON bd.`drugs_standard_code` = sub.`drugs_standard_code` AND bd.`drugs_specification` = sub.`drugs_specification`
) t1
LEFT JOIN `bus_enterprise_drugs` t2 ON t1.id = t2.`drugs_id`;
```
2. 索引优化:对于频繁使用的列,可以考虑创建索引以提高查询性能。在这种情况下,可以创建一个组合索引来覆盖子查询和连接操作所需的列。例如:
```sql
CREATE INDEX idx_drugs_standard_spec ON `bus_drugs` (`drugs_standard_code`, `drugs_specification`);
CREATE INDEX idx_drugs_id ON `bus_enterprise_drugs` (`drugs_id`);
```
请根据实际情况选择适合的索引列。
3. 避免不必要的列选择:只选择需要的列,避免选择不必要的列,以减少数据传输和处理的开销。
4. 数据库优化:根据数据库引擎和实际情况,进行数据库级别的性能优化,例如调整数据库缓存和配置参数等。
请注意,以上只是一些常见的 SQL 优化建议,并不能保证在所有情况下都能得到最佳性能。根据实际情况和数据量,可能需要进一步的优化和调整。
阅读全文